- 论坛徽章:
- 0
|
程序执行:./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;
} |
|