freetds AT lists.ibiblio.org
Subject: FreeTDS Development Group
List archive
[freetds] Problem with CS_PARAM_RESULT (c API) and MSSQL2k
- From: Leonid O Volkov <wolkow AT rosnet.net>
- To: freetds AT lists.ibiblio.org
- Subject: [freetds] Problem with CS_PARAM_RESULT (c API) and MSSQL2k
- Date: Fri, 3 Jun 2005 18:52:40 +0400
Hello, I am new in this list.
I have problem with returning CS_PARAM_RESULT
from exec stored procedure for MSSQL2k (in MSSQL7.0 no problem):
"declare @REASON integer exec BUGPROC @REASON out"
CREATE procedure BUGPROC
@REASON int output
as
set nocount on
set @reason = 99
return 1
GO
I have FreeTDS version 0.63
$ rpm -qa|fgrep freetds
freetds-0.63-1
freetds-devel-0.63-1
client OS and hardware architecture:
2.6.11-1.27_FC3smp #1 SMP Tue May 17 20:38:05 EDT 2005 x86_64 GNU/Linux
FedoraCore 3
or
2.4.18-18.7.xsmp #1 SMP Wed Nov 13 19:01:42 EST 2002 i686
Redhat 7.3
build:
test.c - see in attach
$ gcc -c test.c
$ gcc test.o -lct -ltds -lsybdb -ldl -ltdssrv -o test
connect to MSSQL 2000
$ ./test mssql2000
Connect to mssql2000 succeed.
declare @REASON integer exec BUGPROC @REASON out
CS_STATUS_RESULT
Fetch done successfully.
CS_CMD_SUCCEED
ct_result returned CS_CMD_DONE.
switch (ret) = CS_END_RESULTS.
result=1
connect to MSSQL 7.0
$ ./test mssql7
Connect to mssql7 succeed.
declare @REASON integer exec BUGPROC @REASON out
CS_STATUS_RESULT
Fetch done successfully.
CS_PARAM_RESULT !!!!!
reason=99 !!!!!
All done processing rows.
CS_CMD_SUCCEED
ct_result returned CS_CMD_DONE.
switch (ret) = CS_END_RESULTS.
result=1
By means of what can I get CS_PARAM_RESULT by using MSSQL2k ?
--
Leonid O Volkov Rosnet JSC (+7 095)7813293
http://wolkow.rosnet.ru wolkow AT rosnet.ru
nic-hdl: LOV1-RIPN, LOV1-RIPE
/* FreeTDS version 0.63 $ rpm -qa|fgrep freetds freetds-0.63-1 freetds-devel-0.63-1 client OS and hardware architecture: 2.6.11-1.27_FC3smp #1 SMP Tue May 17 20:38:05 EDT 2005 x86_64 x86_64 x86_64 GNU/Linux Fedora Core 3 2.4.18-18.7.xsmp #1 SMP Wed Nov 13 19:01:42 EST 2002 i686 Redhat 7.3 /usr/lib/libct.so /usr/lib/libct.so.3 /usr/lib/libct.so.3.0.0 /usr/lib/libtds.so /usr/lib/libtds.so.4 /usr/lib/libtds.so.4.0.0 /usr/lib/libsybdb.so /usr/lib/libsybdb.so.5 /usr/lib/libsybdb.so.5.0.0 /usr/lib/libtdssrv.so /usr/lib/libtdssrv.so.2 /usr/lib/libtdssrv.so.2.0.0 $ gcc -c -pipe test.c $ gcc test.o -lct -ltds -lsybdb -ldl -ltdssrv -o test */ #define SQLf "declare @REASON integer exec BUGPROC @REASON out" /* CREATE procedure BUGPROC @REASON int output as set nocount on set @reason = 99 return 1 GO connect to MSSQL 2000 $ ./test mssql2000 Connect to mssql2000 succeed. declare @REASON integer exec BUGPROC @REASON out CS_STATUS_RESULT Fetch done successfully. CS_CMD_SUCCEED ct_result returned CS_CMD_DONE. switch (ret) = CS_END_RESULTS. result=1 connect to MSSQL 7.0 $ ./test mssql7 Connect to mssql7 succeed. declare @REASON integer exec BUGPROC @REASON out CS_STATUS_RESULT Fetch done successfully. CS_PARAM_RESULT !!!!! reason=99 !!!!! All done processing rows. CS_CMD_SUCCEED ct_result returned CS_CMD_DONE. switch (ret) = CS_END_RESULTS. result=1 */ #include <stdio.h> #include <stdlib.h> #include <string.h> #include <ctpublic.h> int main(int argc, char* argv[]) { CS_CONTEXT *ctx; CS_CONNECTION *conn; CS_COMMAND *cmd; CS_RETCODE ret; CS_RETCODE restype; CS_DATAFMT datafmt[10]; CS_INT result; CS_INT reason; CS_DATAFMT columns[1]; CS_INT datalength[1]; CS_SMALLINT indicator[1]; CS_INT count; char server[256]; if ( !(argc == 2) ) { fprintf(stderr,"Usage: ./test host\n"); exit ( 1 ); } strcpy(server,argv[1]); ret = cs_ctx_alloc(CS_VERSION_100, &ctx); ret = ct_init(ctx, CS_VERSION_100); ret = ct_con_alloc(ctx, &conn); ret = ct_con_props(conn, CS_SET, CS_USERNAME, (void*)"user", CS_NULLTERM, NULL); ret = ct_con_props(conn, CS_SET, CS_PASSWORD, (void*)"password", CS_NULLTERM, NULL); if (ret = ct_connect(conn,server,CS_NULLTERM)!=CS_SUCCEED) { fprintf(stderr,"Connect failed.\n"); exit(1); } else { fprintf(stderr,"Connect to %s succeed.\n",server); } ret = ct_cmd_alloc(conn, &cmd); fprintf(stderr,"%s\n",SQLf); ret = ct_command(cmd, CS_LANG_CMD, SQLf, CS_NULLTERM, CS_UNUSED); if (ret != CS_SUCCEED) { fprintf(stderr, "ct_command() failed\n"); exit(1); } ret = ct_send(cmd); if (ret != CS_SUCCEED) { fprintf(stderr, "ct_send() failed\n"); exit(1); } /* ** Process the results of the command. */ while ((ret=ct_results(cmd,&restype))==CS_SUCCEED) { switch (restype) { case CS_ROW_RESULT: fprintf(stderr, "CS_ROW_RESULT\n"); break; case CS_CMD_SUCCEED: fprintf(stderr, "CS_CMD_SUCCEED\n"); break; case CS_CMD_FAIL: fprintf(stderr,"CS_CMD_FAIL\n"); break; case CS_STATUS_RESULT: /*Stored procedure result*/ fprintf(stderr,"CS_STATUS_RESULT\n"); /* ** Bind the column */ columns[0].datatype=CS_INT_TYPE; columns[0].format=CS_FMT_UNUSED; columns[0].scale=0; columns[0].count=1; columns[0].locale=NULL; ct_bind(cmd,1,&columns[0],&result,&datalength[0],&indicator[0]); /* ** Now fetch and print the result. */ while (((ret=ct_fetch(cmd,CS_UNUSED,CS_UNUSED,CS_UNUSED,&count))==CS_SUCCEED) ||(ret==CS_ROW_FAIL)) { /* ** Check if we hit a recoverable error. */ if (ret==CS_ROW_FAIL) { fprintf(stderr,"Error on fetching procedure result."); } } if (ret==CS_END_DATA) { fprintf(stderr,"Fetch done successfully.\n"); } else { fprintf(stderr,"Fetch failed.\n"); return -1; } break; case CS_PARAM_RESULT: /*Stored procedure returning argument*/ fprintf(stderr,"CS_PARAM_RESULT !!!!!\n"); /* ** Now fetch and print the rows. */ columns[0].datatype=CS_INT_TYPE; columns[0].format=CS_FMT_UNUSED; columns[0].scale=0; columns[0].count=1; columns[0].locale=NULL; columns[0].status= CS_RETURN; ct_bind(cmd,1,&columns[0],&reason,&datalength[0],&indicator[0]); while (((ret=ct_fetch(cmd,CS_UNUSED,CS_UNUSED,CS_UNUSED,&count))==CS_SUCCEED) ||(ret==CS_ROW_FAIL)) { /* ** Check if we hit a recoverable error. */ if (ret==CS_ROW_FAIL) { fprintf(stderr,"Error on row %d in this fetch batch.",count+1); } /* ** We have a row, let's print it. */ int i; char buf[256]; fprintf(stderr,"reason=%d !!!!!\n",reason); } if (ret==CS_END_DATA) { fprintf(stderr,"All done processing rows.\n"); } else { fprintf(stderr,"Fetch failed.\n"); return -1; } break; case CS_CMD_DONE: fprintf(stderr,"ct_result returned CS_CMD_DONE.\n"); break; default: fprintf(stderr,"ct_result returned unexpected result type (%d).\n",restype); return -1; } } /* ** Check return value of ct_results() to see ** if everything went ok. */ switch (ret) { case CS_END_RESULTS: fprintf(stderr,"switch (ret) = CS_END_RESULTS.\n"); break; case CS_FAIL: fprintf(stderr,"ct_results() returned fail.\n"); return -1; default: fprintf(stderr,"ct_results() returned unexpected return code (%d).\n",ret); return 1; } fprintf(stderr,"result=%d\n",result); return 0; }
-
[freetds] Problem with CS_PARAM_RESULT (c API) and MSSQL2k,
Leonid O Volkov, 06/03/2005
- Re: [freetds] Problem with CS_PARAM_RESULT (c API) and MSSQL2k, James K. Lowden, 06/04/2005
- <Possible follow-up(s)>
- RE: [freetds] Problem with CS_PARAM_RESULT (c API) and MSSQL2k, ZIGLIO, Frediano, VF-IT, 06/03/2005
- [freetds] Problem with CS_PARAM_RESULT (c API) and MSSQL2k, Leonid O Volkov, 06/03/2005
Archive powered by MHonArc 2.6.24.