Skip to Content.
Sympa Menu

freetds - [freetds] Problem with CS_PARAM_RESULT (c API) and MSSQL2k

freetds AT lists.ibiblio.org

Subject: FreeTDS Development Group

List archive

Chronological Thread  
  • 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;
}



Archive powered by MHonArc 2.6.24.

Top of Page