- 论坛徽章:
- 15
|
原帖由 dayuan555 于 2009-11-25 15:01 发表
我用的就是嵌入式SQL,每次通过结构体取数据或者插表,实在是太烦了,空的处理,空格的处理,时间格式转字符串等等,我基本上要把每个字段的处理方式都要写出来。写的又长又烦,不知道有没有简单点的方法,不能直 ...
看我做的数据库包装器:
完全解决你提的问题。开始名为DTO,后改名为DAU(Data Access Uint),其效果在20页以后。
http://www.itpub.net/thread-1088197-1-1.html
是这个数据库包装器开发的全过程,如需要,与我联系,可提供全套软件供你免费试用。
咱们坛子类似问题很多,我想开个专帖讨论这个问题。
基于一个基本思想:SRM, Struct Relational Mapping,把结构与关系数据库关联起来,互相映射。
关键是 C结构不可解析,我们采取映射的办法,写一个模板说明C结构,帮助我们了解未知结构,并完成与其它数据对象的映射。
模板可以根据数据库表结构自动生成,也可以根据元数据生成,也可以自己写。
DAU基于ORACLE,但不限于ORACLE。该软件使用OCI,经过一个初级包装sqlora(就是3楼推荐的那个),高级包装DAU,完全达到了几乎不写SQL语句问题的境界。它是参照JAVA的Hibernate的ORM写成的。
在那帖子中部,我支持了绑定变量和游标操作,并且在DAU内部实现了保留游标,完全避免语句的解析(每个DAU语句只解析一次),极大的提高了运行效率。
这里的264楼你可以看到程序实例:
http://www.itpub.net/viewthread. ... ;extra=&page=27
其中主要程序是mkxw函数。
你还可以看看:
int addxw(DAU *DP,char *stmt)
{
int ret;
if(ret=DAU_insert(DP,stmt)) {//DP里有数据结构,数据模板,数据库链接句柄,语句被自动生成在stmt里。
生成的语句如下:
INSERT INTO TICKET.SEAT (start_date,beg_station,train_no,run_train,on_date,carno,seat_type,seat_no,end_station,shortest_station,purpose,gride,pro,flag,used_dev,used_uid,used_time) VALUES (to_date(:1,'YYYY-MM-DD'), :2, :3, :4,to_date(:5,'YYYY-MM-DD HH24:MI'), :6, :7, :8, :9, :10, :11, :12, :13, :14, :15, :16,to_date(:17,'YYYY-MM-DD HH24:MI:SS'))
空白、NULL、日期格式一并处理了。
你还可以看看这段:
// 车次车站都确定了,只有一条记录
int get_stop_station(DAU *DP,char *stmt)
{
char *p;
p=DAU_mk_where(DP,"train_no,sequence",stmt);
sprintf(p," AND beg_date <= :beg_date AND end_date >= :beg_date AND flag=0")
if(0 >= DAU_select(DP,stmt,1)) {
ShowLog(1,"get_stop_station stmt=%s",stmt);
return DP->SQL_Connect->Errno;
}
return DAU_next(DP);
}
注意这个语句:sprintf(p," AND beg_date <= :beg_date AND end_date >= :beg_date AND flag=0")
beg_date和end_date都是日期字段,格式应该是'YYYY-MM-DD',DAU有模板,知道这个格式,它会把上述语句变成:
beg_date <= to_date(:1,'YYYY-MM-DD') and end_date>=to_date(:2,'YYYY-MM-DD' )....
然后在模板里找到beg_date,把:1,:2绑定到相应的结构成员。生成的语句:
SELECT train_no,run_train_no,sequence,to_char(beg_date,'YYYY-MM-DD') beg_date,to_char(end_date,'YYYY-MM-DD') end_date,station_code,distance,running_time,stop_time,over,flag FROM TICKET.STOP_STATION WHERE train_no=:1 AND sequence=:2 AND beg_date <= to_date(:3,'YYYY-MM-DD') AND end_date >= to_date(:4,'YYYY-MM-DD') AND flag=0
return DAU_next(DP); //DAU根据模板,fetch一条记录到结构。
有了DAU,直接通过结构体操作数据库的愿望实现了。
proc*c写不出DAU,只有OCI可以。
谁想用DAU,pm我。绝对免费提供源码和使用文档。
[ 本帖最后由 yulihua49 于 2009-11-30 10:01 编辑 ] |
|