如下:
dbcmd(dbproc,″select cur1,cur2 from table where條件″);
dbsqlexec(dbproc);
while((result_code=dbresults(dbproc))!=NO_MORE_RESU
LTS)
{
if(result_code= SUCCEED)
{
dbbind(dbproc,1,INTBIND,(DBINT)0,(BYTE*)&m_cur1);
dbbind(dbproc,2,STRINGBIND,(DBINT)0,m_cur2);
while(dbnextrow(dbproc)!=NO_MORE_ROWS)
{
/*對數據進行處理*/
……
}
}
}
其中dbbind()函數實現字段與變量一一對應的綁定功能,所涉及到的常用變量類型有如下對應關系:
STRINGBIND DBCHAR
INTBIND DBINT
FLT8BIND DBFLT8
需注意的是:如果不為字符型數據,則dbbind()函數中,須用(BYTE*)&的方式取其地址。
五、 其它數據處理的修改
其它數據處理,如修改,刪除,插入等非查詢語句,
在PRO*C中,一條語句EXEC SQL…即可,
在DBL IBRARY/C中,也只需上一部分中的前兩行即可:
dbcmd(dbproc,″update…″);
dbsqlexec(dbproc);
六、 數據提交與回滾的處理
PRO*C中,用如下語句:
EXEC SQL COMMIT WORK 〖RELEASE〗;
或:
EXEC SQL ROLLBACK WORK 〖RELEASE〗;
此RELEASE參數的有無決定是否提交或回滾後即退出數據連接,而DBLIBRARY/C中,則如下處理:
dbcmd(dbproc,″commit transcation″);
dbsqlexec(dbproc);
或:
dbcmd(dbproc,″rollback transcation″);
dbsqlexec(dbpr
您正在看的Sybase教程是:PRO*C程序移植為DBLIBRARY/C程序經驗談。e;
t_balance=m_balance;
}
}
continued:
EXEC SQL CLOSE check;
printf(″%s\t%d\t%.2f ″,t_name,str,t_age,t_balance);
EXEC SQL COMMIT WORK RELASE;
exit(0);
quited:
printf(″%s″,sqlca.sqlerrm.sqlerrmc);
EXEC SQL ROLLBACK RELASE;
exit(-1);
}
改為DBLIBRARY/C程序如下(sample.c):
#include
#include
#include
#include
#define ERR_CH stderr
int err_handler();
int msg_handler();
main()
{
DBPROCESS *dbproc;
LOGINREC *login;;
RETCODE result_code;
DBCHAR m_name[20];
DBINT m_age;
DBFLT8 m_balance;
char t_name [20];
int t_age;
float t_balance=0.00;
if(dbinit()==FAIL)
exit(-1);
dberrhandle(err_handler);
dbmsghandler(msg_handler);
login=dblogin();
DBSETLUSER(login,″user″);
DBSETLPWD(login,″passwd″);
DBSETLAPP(login,″sample″);
dbproc=dbopen(login,NULL);
dbcmd(dbproc,″select name,age,balance from table″);
dbsqlexec(dbproc);
while((result_code=dbresults(dbproc))!=NO_MORE_RESU
LTS)
{
if(result_code==SUCCEED)
{
dbbind(dbproc, 1, STRINGBIND, (DBINT)0, m_name);
dbbind(dbproc,2,INTBIND,(DBINT)0,(BYTE*)&m_age);
dbbind(dbproc,3,FLT8BIND,(DBINT)0,(BYTE*)&m_balance);
while(dbnextrow(dbproc)!=NO_MORE_ROWS)
{
if(m_balance>t_balance)
{
strcpy(t_name,m_name);
t_age=m_age;
t_balance=m_balance;
}
}
}
printf(″%s\t%d\%.2f″,t_name,t_age,t_balance);
dbexit();
exit(0);
}
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)))
return(INT_EXIT);
else
{
fprintf (ERR_CH,″DB-Library error;\n\t%s\n″,dberrstr);
if(oserr!=DBNOERR)
fprintf (ERR_CH,″Operating-system error:\n\t%s\n″,oserrstr);
return(INT_CANCEL);
}
}
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;
DBUSMALLINT line
{
fprintf(ERR_CH,″Msg %ld,Level %d,State %d\n″,
msgno,severity,msgstate);
if(strlen(srvname)>0)
fprintf (ERR_CH,″Server'%s',″,srvname);
if (strlen(procname)>0)
fprintf (ERR_CH,″Procedure'%s,″,procname);
if(line>0)
fprintf(ERR_CH,″Line %d″,line);
fprintf (ERR_CH,″\n\t%s\n″,msgtext);
return(0);
}
如$(SYBASE)=/u/Sybase,編譯命令行如下:
cc -I.-I/u/sybase/include sample.c /u/Sybase/lib/libsybdb.a-lnsl_s-lm-o sample
PRO*C和DBL IBRARY/C是兩種典型的數據庫應用程序設計接口:一為嵌入式SQL方法,一為提供純C函數方法。所涉及到的知識是比較龐雜的,作者也僅是略窺門徑。希望本文若能對有興趣的讀者起到引門入徑之作用,則吾願足矣。
作者單位:劉小余(中國農業銀行新疆自治區塔城地區分行信息電腦中心 新疆 塔城 834700)