免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1847 | 回复: 1
打印 上一主题 下一主题

!!有了这个以后sybase编程就没有问题了!! [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2004-07-28 22:14 |只看该作者 |倒序浏览
程序执行:./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;       

}

论坛徽章:
0
2 [报告]
发表于 2004-07-30 09:45 |只看该作者

!!有了这个以后sybase编程就没有问题了!!

用java了.
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP