- 论坛徽章:
- 0
|
先把代码列出来
....
DBPROCESS * proc;
....
int sqlcmd(char *cmd)
{
if(!proc)return 2;
printf("dbcanquery %d\n",dbcanquery(proc));
dbcmd(proc,cmd);
dbsqlexec(proc);//关键点
if (dbresults(proc)!=SUCCEED){
dbcmd(proc,"rollback"
dbsqlexec(proc);
dbresults(proc);
return 1;
}
return 0;
}
这里的proc是联到一台win2K机器上的SQL server上的,在我标注出的"关键点"处,可能会出现一些问题,让我比较疑惑。详细如下
正常情况下,sqlcmd执行是正常的,但在实际中有这样的情况:程序启动后proc就联接成功了,但在关键点一句之前,由于某种原因,网络出现的问题,这时的proc没有正常关闭,似乎系统认为proc仍然可用,dbcanquery返回的也是SUCCEED/1,但这时执行dbsqlexec时就会出错(肯定的了,网络都断了啊),程序的错误处理是
int CS_PUBLIC dberr_handler(DBPROCESS *dbproc,int serity,int dberr,int oserr,char *dberrstr,char *oserrstr)
{
if(dbproc==NULL){
lprintf("DB-Library error:dbproc is NULL!\n"
return(INT_EXIT);
}
else if(DBDEAD(dbproc)){
lprintf("DB-Library error:dbproc is dead!\n"
return(INT_EXIT);
}
else{
//lprintf("DB-Library error:%s\n",dberrstr);
if(oserr!=DBNOERR)lprintf("Operating system error:%s\n",oserrstr);
return(INT_CANCEL);
}
}
这样程序就会退出了,我的目的是不要让程序退出,用某种办法来测试一下proc是不是好的,如果已经坏了就不再执行dbsqlexec了,清理一下现场,接着执行其它的,或者重新试图联接一下,生成一个新的proc。总之不要让程序退出就行了。
当然目的是不要让程序退出,有其它方法也可以,我对sybase很不了解,上面的代码也是抄来的,所以看不大明白,问题也不太会提,请方家指点一二,如有阐述不清之处,也请指出,我来现作说明。
多谢多谢,有劳 |
|