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.