Chinaunix

标题: !!有了这个以后sybase编程就没有问题了!! [打印本页]

作者: victory7    时间: 2004-07-28 22:14
标题: !!有了这个以后sybase编程就没有问题了!!
程序执行:./test  “ select *from test   DECLARE @name char(20)     exec myproc 3,@name output “

可以返回两个结果集、返回参数以及状态值等。
#include <stdio.h>;
#include <stdlib.h>;
#include <unistd.h>;
#include <string.h>;
#include <signal.h>;
#include <setjmp.h>;
#include <errno.h>;
#include <sys/ipc.h>;
#include <sys/msg.h>;
#include "log.h"

#include "db.h"
char server_name[10]="TA_DEV";
CLog txlog("txserver.log";
char conn_string[100]="sa;;TA_DEV;tempdb;300;300";
struct
{
    char data[100];
    long sqltype;
    long len;
} mData[4];
LOGINREC *login;
DBPROCESS *dbProcess;
int ErrorHandler(DBPROCESS *pDbproc, int nSeverity, int nDBLibError,    int nOSError, char *pszDBLibError, char *pszOSError)
{
        char sqlstatement[1201];
        printf( "error code =%ld", nDBLibError);
        printf( "erro= %s", pszDBLibError);
        return(0);
}
int MessageHandler(DBPROCESS *pDbproc, DBINT lMessage, int nState,      int nSeverity, char *pszMessage, char *pszServer, char *pszProcedure,DBUSMALLINT usLine)
{
        printf("severity=%d\n", nSeverity);
         printf("message=%s\n", pszMessage);
         printf("pszServer=%s\n", pszServer);
         printf("pszProcedure=%s\n", pszProcedure);
        return(0);
}
int main(int argc, char **argv)
{
        char pkgseqno[100+1];
        char teller[10] ;
        int rc;
        char exesql[100];
        int colnums;
        ZDC_ERROR z_err;
        int i;
       
       
        strcpy(exesql, argv[1]);
        //strcpy(exesql, "select name,no from test where no=3 select 'hello'";
        //strcpy(exesql, "exec myproc";
        printf("esesql=[%s]\n", exesql);

        if (dbinit()==FAIL)
                printf("dbinit error\n";
        //dberrhandle((EHANDLEFUNC)ErrorHandler);
        //dbmsghandle((MHANDLEFUNC)MessageHandler);
        if ((login = dblogin()) == NULL)
                printf("dblogin error\n";
        DBSETLUSER(login, "sa";
        DBSETLPWD(login, "";
        if (DBSETLHOST(login, "TA_DEV" != SUCCEED)
               printf("set host\n";
        DBSETLAPP(login, "tempdb";
        if (DBSETLCHARSET(login, "cp850") != SUCCEED)
                printf("setcharset \n");

        dbProcess = dbopen(login,"TA_DEV");
        dbuse(dbProcess, "tempdb");
        if (dbProcess == NULL)
                printf("open db error\n");

        /* get packet serial no in database */

        memset(pkgseqno, 0, sizeof pkgseqno);

        if (dbcmd(dbProcess,exesql)!=SUCCEED)
        {
                printf("1dbcmd(dbProcess,exesql)\n");
        }

        if (dbsqlexec(dbProcess)!=SUCCEED)
        {
                printf("2dbsqlexec(dbProcess)\n");
        }
// execute sql statment 如果是执行单个sql语句,就可以判断是否执行成功
//如果返回的有结果集       
        if (dbresults(dbProcess)!=SUCCEED)
        {
                printf("get results error\n");
                dbcancel(dbProcess);
                //return ZDC_ERROR_GENERAL;
        }
//得到结果集类数以及各个类型和长度准备存放这些结果的数据
        colnums=dbnumcols(dbProcess);
        printf("colnums=%d\n", colnums);
       
        DBINT clen;
        long sqlType;
        for ( i = 0; i < colnums; i++)
        {
                clen = dbcollen(dbProcess,i+1);
                sqlType = dbcoltype(dbProcess,i+1);
                //
                mData.sqltype = sqlType;
                mData.len = clen;
                //
                switch ((int)sqlType)
                {
                        case SYBNUMERIC:
                        case SYBDECIMAL:
                        case SYBBIT:
                        case SYBINT1:
                        case SYBINT2:
                        case SYBINT4:
                        case SYBINTN:
                        case SYBFLT8:
                        case SYBREAL:
                        case SYBFLTN:
                        case SYBDATETIME4:
                        case SYBDATETIME:
                        case SYBDATETIMN:
                        case SYBMONEY:
                        case SYBMONEYN:
                        case SYBMONEY4:
                                clen = DB_NUMERIC_LEN ;
                                break;
                        case SYBVARBINARY:
                        case SYBLONGBINARY:
                        case SYBBINARY:
                        case SYBIMAGE:
                        case SYBLONGCHAR:
                        case SYBTEXT:
                        case SYBVOID:
                                clen *= 2;
                                break;
                        default:
                                break;
                }
//                mData.data = new char[clen+1];
                memset(mData.data, 0, sizeof(mData.data));
        }
//捆绑对应的数据
        for (i=0;i<colnums;i++)
        {
                if (dbbind(dbProcess, (i + 1), NTBSTRINGBIND,(DBINT)0,        (unsigned char *)mData.data) == FAIL)
                {
                printf("5\n");
                }
                printf("data=%s,sqltype=%d,len=%d\n", mData.data ,mData.sqltype, mData.len);
        }
//读取每一行数据

        for ( ; ; )
        {
                rc = dbnextrow(dbProcess);
                if (rc  == MORE_ROWS)
                {
                        printf("data=%s,sqltype=%d,len=%d\n", mData[0].data ,mData[0].sqltype, mData[0].len);
                        printf("data=%s,sqltype=%d,len=%d\n", mData[1].data ,mData[1].sqltype, mData[1].len);
                }
                else
                        if (rc  == NO_MORE_ROWS)       
                        {
                                printf("no_more_rows\n");
                                break;
                        }
                        else
                        {
                                printf("get nextrow error\n");
                                break;
                        }
        }
        if (dbresults(dbProcess)!=SUCCEED)
        {
                printf("get results error\n");
                dbcancel(dbProcess);
                //return ZDC_ERROR_GENERAL;
        }
//得到结果集类数以及各个类型和长度准备存放这些结果的数据
        colnums=dbnumcols(dbProcess);
        printf("colnums=%d\n", colnums);
       
        for ( i = 0; i < colnums; i++)
        {
                clen = dbcollen(dbProcess,i+1);
                sqlType = dbcoltype(dbProcess,i+1);
                //
                mData.sqltype = sqlType;
                mData.len = clen;
                //
                switch ((int)sqlType)
                {
                        case SYBNUMERIC:
                        case SYBDECIMAL:
                        case SYBBIT:
                        case SYBINT1:
                        case SYBINT2:
                        case SYBINT4:
                        case SYBINTN:
                        case SYBFLT8:
                        case SYBREAL:
                        case SYBFLTN:
                        case SYBDATETIME4:
                        case SYBDATETIME:
                        case SYBDATETIMN:
                        case SYBMONEY:
                        case SYBMONEYN:
                        case SYBMONEY4:
                                clen = DB_NUMERIC_LEN ;
                                break;
                        case SYBVARBINARY:
                        case SYBLONGBINARY:
                        case SYBBINARY:
                        case SYBIMAGE:
                        case SYBLONGCHAR:
                        case SYBTEXT:
                        case SYBVOID:
                                clen *= 2;
                                break;
                        default:
                                break;
                }
//                mData.data = new char[clen+1];
                memset(mData.data, 0, sizeof(mData.data));
        }
//捆绑对应的数据
                memset(mData[0].data, 0x00, sizeof(mData[0].data));
                memset(mData[1].data, 0x00, sizeof(mData[1].data));
        for (i=0;i<colnums;i++)
        {
                if (dbbind(dbProcess, (i + 1), NTBSTRINGBIND,(DBINT)0,        (unsigned char *)mData.data) == FAIL)
                {
                printf("5\n");
                }
                printf("data=%s,sqltype=%d,len=%d\n", mData.data ,mData.sqltype, mData.len);
        }
//读取每一行数据

        for ( ; ; )
        {
                rc = dbnextrow(dbProcess);
                if (rc  == MORE_ROWS)
                {
                        printf("data=%s,sqltype=%d,len=%d\n", mData[0].data ,mData[0].sqltype, mData[0].len);
                        printf("data=%s,sqltype=%d,len=%d\n", mData[1].data ,mData[1].sqltype, mData[1].len);
                }
                else
                        if (rc  == NO_MORE_ROWS)       
                        {
                                printf("no_more_rows\n");
                                break;
                        }
                        else
                        {
                                printf("get nextrow error\n");
                                break;
                        }
        }
//如果是存储过程,且又返回值
//        if (pTable->;RetStatus() == 2||pTable->;RetStatus() == 3){
        //if dbretstatus(dbProcess)
        // pTable->;RetData(packno,1)
//存储过程返回状态值 return 100;
        rc = dbretstatus(dbProcess);
        printf("retstatus=%d\n", rc);

//存储过程返回参数值 output;
       
        if (dbnumrets(dbProcess) == 0)
                printf("no return values \n");
        int retlen = dbretlen(dbProcess,1); //读取第一个返回值
        if (retlen == 0)
                printf("6\n");
        strncpy(pkgseqno,(char *)dbretdata(dbProcess,1),retlen);
        printf("pgrf=%s\n", pkgseqno);
       
        dbloginfree(login);
        dbexit();
        dbclose(dbProcess);

        return 0;       

}
作者: orafuncle    时间: 2004-07-30 09:45
标题: !!有了这个以后sybase编程就没有问题了!!
用java了.




欢迎光临 Chinaunix (http://bbs.chinaunix.net/) Powered by Discuz! X3.2