前言
使用VC++6.0来操作api是非常方便的,但是用来操作数据库就一点不方便了。看着powerbuilder写SQL真的好方便。
想着能用VC使用数据库操作方便一点就好了。
实现
版本一
SQL:
select id,name,birthday from userinfo where rowid = 10;
函数 :
int dbselect(LPCSTR lpSQLText,...)
VC调用:
int id ;
String name;
DateTime dt ;
long rowid = 1001;
dbselect("select id,name,birthday into :i,:s,:d from userinfo where rowid=%d",&id,&name,&dt,rowid)
//版本1.0 / Transaction::dbinit(); sqlca.ServerName = "127.0.0.1,9527"; sqlca.DataBase = "NewHis"; sqlca.UserId = "sa"; sqlca.PassWord = "00000"; sqlca.LoginTime = 10; sqlca.AppName = "ding.."; dbconnect(sqlca); String strID; String strUserID; String strUserName; int id = 1 ; dbselect("select id,userid,username into :s,:s,:d from userinfo where id = %i" ,&strID,&strUserID,&strUserName, id); // String strResult; strResult.Format("id:%s user:%s name:%s", strID,strUserID,strUserName); cout<< (LPCSTR)strResult<<endl ; cout<<"dbcommand:"<<endl; dbcommand("update userinfo set userid ='%s' where id = %d","管理员1",1); disconnect(sqlca);
思路:
提取 into .....from 之间的标识符,可以识别变量的类型,
arglist中的参数,按序列传递变量的地址,这样写的方法很简单,但是变量多了,容易出错,容易弄错顺序。
版本2
int dbselect(Addr[] & p,LPCSTR lpSqlText,...)
调用:
int id ;
String name;
DateTime dt ;
Addr a;
a[0].addr = &id;
a[0].type = int;
a[1].addr = &name;
a[1].type = String;
dbselect(a,"select id ,name,birthday from userinfo where rowid=%d",1001)
//版本2.0 / int id =10; DEF(ADDRINFO,adr); VAR(adr,int,iUserId ); //新变量 VAR(adr,CString,strUserName); REF(adr,int,id); //已有的变量 dbselect(adr,"select id,name,birth From useirnfo where id =%d",100);
思路:
把参数和类型和变量地址放到数组中addr,这样就可以清楚一点了。
再定义一个宏
#def var(a,t,n) t n;a.pushargs(t,n);
实际调用 :
var(a,int ,id);
var(a,string,name);
var(a,DateTime,birth)
dbselect(a,"select * from userinfo where rowid = %d",1001)
总结
这是最常用到的SQL调用,这样我可以比较方便的调用SQL,以后有什么好的方法再加以精炼。
在这里留个备注,好记性不如烂笔头: