前言
使用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,以后有什么好的方法再加以精炼。
在这里留个备注,好记性不如烂笔头: