[freetds] state of dbrpcsend()

Thompson, Bill D (London) bill_d_thompson at ml.com
Thu Jun 10 04:26:14 EDT 2004

Hi again Liam,

I've tried this out, and it works. 

here's my C program (databases, logins etc XXXXX'd out)

#include <stdio.h>
#include <sybfront.h>
#include <sybdb.h>

int err_handler();
int msg_handler();

main(argc, argv)
int             argc;
char            *argv[];
    DBPROCESS     *dbproc;
    LOGINREC      *login;

    RETCODE        result_code;
    DBINT          highest, lowest, ret_stat;

    if (dbinit() == FAIL)


    login = dblogin();

    highest = 10;
    lowest  = 2;

    dbproc = dbopen(login, NULL);


    dbrpcinit(dbproc, "dbo.sp_freetds_test", 0);

    dbrpcparam(dbproc, "@lowest", 0, SYBINT4, -1, -1,
               (BYTE *) &lowest);
    dbrpcparam(dbproc, "@highest", 0, SYBINT4, -1, -1,
               (BYTE *) &highest);


    while ((result_code = dbresults(dbproc)) != NO_MORE_RESULTS)
        printf("dbresults returns (%d) \n", result_code);
    printf("dbresults returns (%d) \n", result_code);

    if (dbhasretstat(dbproc) == TRUE) {
        ret_stat = dbretstatus(dbproc);
        printf("sp return status %d\n", ret_stat);


int err_handler(dbproc, severity, dberr, oserr, dberrstr, oserrstr)
DBPROCESS       *dbproc;
int             severity;
int             dberr;
int             oserr;
char            *dberrstr;
char            *oserrstr;
    if ((dbproc == NULL) || (DBDEAD(dbproc)))
        fprintf (stderr, "DB-Library error:\n\t%s\n", dberrstr);

        if (oserr != DBNOERR)
            fprintf (stderr, "Operating-system error:\n\t%s\n", oserrstr);


int msg_handler(dbproc, msgno, msgstate, severity, msgtext,
                srvname, procname, line)

DBPROCESS       *dbproc;
DBINT           msgno;
int             msgstate;
int             severity;
char            *msgtext;
char            *srvname;
char            *procname;
int         line;

    fprintf (stderr, "Msg %ld, Level %d, State %d\n",
            msgno, severity, msgstate);

    if (strlen(srvname) > 0)
        fprintf (stderr, "Server '%s', ", srvname);
    if (strlen(procname) > 0)
        fprintf (stderr, "Procedure '%s', ", procname);
    if (line > 0)
        fprintf (stderr, "Line %d", line);

    fprintf (stderr, "\n\t%s\n", msgtext);


and my stored proc :

1> create proc dbo.sp_freetds_test (@lowest int, @highest int)
2> as
3> begin
4>    declare @difference int
5>    select @difference = @highest - @lowest
6>    return @difference
7> end
1> grant exec on dbo.sp_freetds_test to XXXXXXXX

and my output when running the program :

Msg 5701, Level 0, State 2
Server 'XXXXXXXX',
        Changed database context to 'master'.
Msg 5703, Level 0, State 1
Server 'XXXXXXXX',
        Changed language setting to us_english.
Msg 5701, Level 0, State 1
Server 'XXXXXXXX', Line 1
        Changed database context to 'XXXXXXXXXXXX'.
dbresults returns (1)
dbresults returns (2)
sp return status 8

Which database are you using ? I presume SQL server 2000
check your TDS VERSION is correct in the freetds.conf file.
This should be 7.0 or 8.0 for SQL 2K, e.g.

	tds version = 7.0



> -----Original Message-----
> From:	liam at inodes.org [SMTP:liam at inodes.org]
> Sent:	10 June 2004 02:08
> To:	FreeTDS Development Group
> Subject:	Re: [freetds] state of dbrpcsend()
> On Wed, Jun 09, 2004 at 03:16:19PM +0100, Thompson, Bill D (London) wrote:
> > to make the C code match your sp you'd have to omit the third call to
> > dbrpcparam() and capture the return status with the appropriate calls
> > to
> > dbresults, dbhasretstat and dbretstatus 
> Thanks for your response.
> I've changed the code to call dbrpcparam() twice only but it still fails
> in dbrpcsend(). Again, it never reaches the wire. Given that it doesn't
> touch the wire after dblogin() is called, would it even matter if I had
> my arguments specified incorrectly? It appears something is amiss inside
> dbrpcsend().
> Suggestions?
> I might go and compile FreeTDS and dblib with -g and see what's going
> on.
> Cheers.
> _______________________________________________
> FreeTDS mailing list
> FreeTDS at lists.ibiblio.org
> http://lists.ibiblio.org/mailman/listinfo/freetds


If you are not an intended recipient of this e-mail, please notify
the sender, delete it and do not read, act upon, print, disclose,
copy, retain or redistribute it.

Click here for important additional terms relating to this e-mail.


More information about the FreeTDS mailing list