From: Dave C. <dj...@ob...> - 2005-03-19 00:59:16
|
Dave Cole wrote: > Dave Cole <dj...@ob...>Dave Cole > <dj...@ob...>Dave Cole wrote: > >> I just installed ASE 12.5.2 on my machine so I could do some testing. >> It appears there is a problem with the Cursor.callproc() method, but >> only when you use a sequence to pass parameters. Dictionary >> parameters are fine. >> >> The attached sp_test.py program shows my testing. >> >> This program produces the following output (after applying the >> attached callproc.patch to fix sequence argument passing). >> >> {'@num': 12345, '@result': 12345} >> [54321, 54321] >> >> If I remove the comment character from the code that enables the >> debugging I get the output contained in the attached sp_test.log. >> >> So if it is not working with FreeTDS then they are doing something >> slightly differently that is either confusing my code or is incorrect. > > > I just installed FreeTDS 0.61 (Debian sarge) and the test program fails > to run. The ct_param() functions fail. What I did discover was that > you can fudge it like this: > > print db.execute(''' > declare @result int > exec sp_test_output 12345, @result output > select @result > ''') > > It prints the following: > [[], [(12345,)]] > > I am now downloading the current cvs snapshot for FreeTDS to see if they > have fixed parameter passing. I just downloaded and installed the CVS snapshot. With the original test program it appears to send the parameters to the server but fails with a server message. Looking at the debug log: Cursor.callproc ct_cmd_alloc(conn0, &cmd) -> CS_SUCCEED, cmd3 ct_command(cmd3, CS_RPC_CMD, "sp_test_output", CS_NULLTERM, CS_UNUSED) -> CS_SUCCEED ct_param(cmd3, &databuf0->fmt=[name:"@result" type:CS_INT_TYPE status:CS_RETURN format:CS_FMT_UNUSED count:1 maxlength:4 scale:0 precision:0], databuf0->buff, 4, 0) -> CS_SUCCEED ct_param(cmd3, &databuf1->fmt=[name:"@num" type:CS_INT_TYPE status:CS_INPUTVALUE format:CS_FMT_UNUSED count:1 maxlength:4 scale:0 precision:0], databuf1->buff, 4, 0) -> CS_SUCCEED So it appears that parameters are being accepted by FreeTDS but from the next debug lines, they are not being sent correctly. ct_send(cmd3) -> CS_SUCCEED servermsg_cb Msg 245, Level 16, State 1, Procedure sp_test_output Domain error during implicit conversion of DECIMAL value '' to a INT field. servermsg_cb Msg 245, Level 16, State 1, Procedure sp_test_output Domain error during implicit conversion of DECIMAL value '' to a INT field. ct_results(cmd3, &result) -> CS_SUCCEED, CS_STATUS_RESULT ct_cancel(conn0, NULL, CS_CANCEL_ALL) -> CS_SUCCEED Traceback (most recent call last): File "a.py", line 21, in ? r = c.callproc('sp_test_output', {'@num': 12345, '@result': Sybase.OUTPUT(1)}) File "/usr/lib/python2.3/site-packages/Sybase.py", line 718, in callproc self.description = fetcher.start(self.arraysize, out_params) File "/usr/lib/python2.3/site-packages/Sybase.py", line 391, in start return _FetchNow.start(self, arraysize) File "/usr/lib/python2.3/site-packages/Sybase.py", line 315, in start raise e Sybase.DatabaseError: Msg 245, Level 16, State 1, Procedure sp_test_output Domain error during implicit conversion of DECIMAL value '' to a INT field. Msg 245, Level 16, State 1, Procedure sp_test_output Domain error during implicit conversion of DECIMAL value '' to a INT field. Even more worrying is that the fudge in the previous message no longer works. I get crap back. Oh well, looks like I can wait for another couple of FreeTDS releases before trying again... - Dave -- http://www.object-craft.com.au |