- 论坛徽章:
- 15
|
利用包装器访问数据库,可以简化数据库操作,将访问逻辑与应用逻辑分离是程序更加清晰易懂。特别是,程序与数据适当分离,当数据结构变动时,尽可能少的改动程序。
我在这方面做了一点工作,与大家分享。
与JAVA的Hibernate类似的东西,在C语言实现,当然不是面向对象的,但也考虑改成C++。
http://www.itpub.net/thread-1088197-1-1.html
这个包开始名为DTO,后来改名DAU,意为Data Access Unit 。现在是用于ORACLE的,容易改成其它数据库。
微软公司的ADO (ActiveX Data Objects) 是一个用于存取数据源的COM组件。它提供了编程语言和统一数据访问方式OLE DB的一个中间层。允许开发人员编写访问数据的代码而不
用关心数据库是如何实现的,而只用关心到数据库的连接。访问数据库的时候,关于SQL的知识不是必要的,但是特定数据库支持的SQL命令仍可以通过ADO中的命令对象来执行。
DAU赞同ADO的这些概念,并在更广泛的平台上使用。功能上也有进一步的改进,基本上可以在运行时生成SQL语句,在多数情况下不需要手动写,从而将SQL语句彻底从应用中隔离
出来。
看看ADO的update语句:
sql="UPDATE customers SET " PsOXNSF6<_
sql=sql & "companyname='" & Request.Form("companyname" & "',"
sql=sql & "contactname='" & Request.Form("contactname" & "',"
sql=sql & "address='" & Request.Form("address" & "',"
sql=sql & "city='" & Request.Form("city" & "',"
sql=sql & "postalcode='" & Request.Form("postalcode" & "',"
sql=sql & "country='" & Request.Form("country" & "'"
sql=sql & " WHERE customerID='" & cid & "'"
on error resume next
要是DAU:
//sprintf(stmt,"WHERE customerID=:customerID";这句还有WHERE,改下句:
//DAU _mk_where(&sql_DAU,"customerID",stmt);这句还是出现了列名,改下句:
//sql_DAU.srm.pks记录了表的主键,下面的语句生成了上面的语句,而且更具通用性,可以处理任何按主键修改的表。
DAU_mk_where((&sql_DAU,sql_DAU.srm.pks,stmt);//如果customerID是主键
ret=DAU_update(&sql_DAU,stmt);
就完事了。
象这样的语句:
sql=sql & "companyname='" & Request.Form("companyname" & "',"
在DAU内部,用完全类似的过程自动生成的。
下边看一个程序实例,涉及两个表的关联查询:其中JSON是我们的通信传输格式。
JSON_OBJECT get_shift(T_SQL_Connect *SQL_Connect,char *msg)
{
int ret;
DAU u_DAU[2],tdev_DAU;
JSON_OBJECT result,json;
T_PkgType tdev_tpl[2]; //想选几个字段n+1
result=json_object_new_array();
ret=DAU_init(&tdev_DAU,SQL_Connect,"tuxdev",0,0);//从数据库生成表结构
partt_copy(tdev_tpl,tdev_DAU.srm.tp,"devname"); //生成子模板,想选几个字段用,分割列表
ret=DAU_init(&u_DAU[0],SQL_Connect,"dev_shift a",0,0);
DAU_init(&u_DAU[1],SQL_Connect,"tuxdev b",tdev_DAU.srm.rec,tdev_tpl);
sprintf(msg,"WHERE a.devid=b.devid");
ret=DAU_getm(2,u_DAU,msg,0);// 生成并执行SQL语句。
while(!DAU_nextm(2,u_DAU)) {//取结果集一条记录
json=json_object_new_object();
DAU_toJSON(&u_DAU[0],json,0);//dev_shift全部打包到json
DAU_toJSON(&u_DAU[1],json,"devname");//组合devname到json
json_object_array_add(result,json);//在JSON数组中加入一条记录
}
DAU_freem(2,u_DAU); //释放访问单元
DAU_free(&tdev_DAU);//释放访问单元
return result;
}
执行结果:
下面是生成的语句:
buf=SELECT a.devid,to_char(a.stat_date,'YYYY-MM-DD') stat_date,a.shift_flg,a.shift_code,a.userid,to_char(a.log_time,'YYYY-MM-DD HH24:MI:SS') log_time,a.beg_no,b.devname FROM TICKET.dev_shift a,TICKET.tuxdev b WHERE a.devid=b.devid
数据:
result=[ { "devid": "JOLTTEST", "stat_date": "2008-10-20", "shift_flg": "BB", "shift_code": "5", "userid": "hp", "log_time": "2008-10-20 14:44:34", "beg_no": "A0000001", "devname": "JOLT测试终端" }, { "devid": "JOLTTEST1", "stat_date": "2008-11-06", "shift_flg": "AB", "shift_code": "5", "userid": "hww", "log_time": "2008-11-06 16:12:26", "beg_no": "A0000001", "devname": "黄伟伟的JOLT测试终端" }, { "devid": "SP0102002", "stat_date": "2009-01-20", "shift_flg": "DB", "shift_code": "5", "userid": "ylh", "log_time": "2009-01-20 13:54:03", "beg_no": "A0000001", "devname": "售票测试终端2" }, { "devid": "SP0102003", "stat_date": "2008-10-16", "shift_flg": "DB", "shift_code": "5", "userid": "", "log_time": "2008-10-16 10:14:53", "beg_no": "A0000001", "devname": "售票测试终端3" } ]
如果有人诚意需求,可以提供源码,共同切磋。
[ 本帖最后由 yulihua49 于 2009-2-10 16:59 编辑 ] |
|