免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 2998 | 回复: 2
打印 上一主题 下一主题

自动生成ODBC代码的想法 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2010-11-23 19:47 |只看该作者 |倒序浏览
本帖最后由 logicBaby 于 2010-11-23 19:51 编辑

最近在用DB2 CLI ODBC写一个db访问层,C的,没有类似Java的Hibernat之类的东西。

之前的代码全部是使用DEmbeded SQL写的db2的*.sqc,oracle的*.pc,但是DB2那个bnd文件经常搞的很头大!而且我们系统需要兼容几乎所有主流数据库,用ESQL不是长久之计。
想换用ODBC接口,但是ODBC开发的代码大量的SQLBindParameter,SQLBindCol,编程效率很低,且很繁杂。
之前在论坛看过有人说想做ESQL到ODBC的编译器,我认为那样更复杂。我想做个能自动生成代码的工具,有两个想法:

1、程序运行第一次需要访问数据库时,读XML表示的表结构,并将表结构转化为内部结构(比如链表)读入共享内存。根据此结构信息访问数据库。通过这种方法写好一些接口供上层调用,根据不同的参数(表名)读表结构,访问db。

2、提供代码模板功能+XML DDL,生成模板对应的代码。

不知道XML DDL有没有标准?
另外,这个东东只想用C做。

可能是我拍脑袋的想法,不知道有没有误入歧途。 请各问大大给点建议,或是有更好的方法?现在大型系统中C访问DB的流行的方法是什么?

论坛徽章:
0
2 [报告]
发表于 2010-11-23 20:09 |只看该作者
咋么有人回呢????

论坛徽章:
15
射手座
日期:2014-11-29 19:22:4915-16赛季CBA联赛之青岛
日期:2017-11-17 13:20:09黑曼巴
日期:2017-07-13 19:13:4715-16赛季CBA联赛之四川
日期:2017-02-07 21:08:572015年亚冠纪念徽章
日期:2015-11-06 12:31:58每日论坛发贴之星
日期:2015-08-04 06:20:00程序设计版块每日发帖之星
日期:2015-08-04 06:20:00程序设计版块每日发帖之星
日期:2015-07-12 22:20:002015亚冠之浦和红钻
日期:2015-07-08 10:10:132015亚冠之大阪钢巴
日期:2015-06-29 11:21:122015亚冠之广州恒大
日期:2015-05-22 21:55:412015年亚洲杯之伊朗
日期:2015-04-10 16:28:25
3 [报告]
发表于 2010-11-24 17:19 |只看该作者
本帖最后由 yulihua49 于 2010-11-25 12:46 编辑
最近在用DB2 CLI ODBC写一个db访问层,C的,没有类似Java的Hibernat之类的东西。

之前的代码全部是使用D ...
logicBaby 发表于 2010-11-23 19:47



    做了一个数据库包装器,支持ORACLE和DB2。
在包装过程中,支持绑定变量,是透明绑定的,程序员不需要了解绑定的细节。

使用方法:
#include <sqli.h> //sql intrefave,自己写的接口定义
。。。。。。
T_SQL_Connect SQL_Connect; //包装器定义的数据库句柄
DAU t_DAU; //Data Access Unit
char buf[4096];
TTT_stu ttt;//对应数据表TTT的数据结构定义;
extern T_PkgType TTT_tpk[]; //数据表TTT的模板,在外部由实用程序自动生成(包括 TTT_stu)。
                    envcfg(argv[1]);//读配置文件,有数据源的连接定义
             int ret=db_open(&SQL_Connect); //打开数据库
             DAU_init(&t_DAU,&SQL_Connect,0,&ttt,TTT_tpl);//构建DAU
             ttt.ID=1;//检索条件
             sprintf(buf,"WHERE ID=:ID");//就像Hibernate的HQL,只写where子句,绑定变量是模板中的列名。
         ret=DAU_select(&t_DAU,stmt,0); //构建SQL语句,执行,绑定变量。0代表需要全部结果集
//生成的语句是:SELECT ID,"Ch" Ch,VCH,SH,DB,BI,TO_CHAR(TIMESTAMP_ISO(DAY),'YYYYMMDD') as DAY,TO_CHAR(TIMS,'YYYY-MM-DD HH24:MI:SS.NNNNNN') as TIMS,TO_CHAR(TIMESTAMP_ISO(TIM),'HH24:MI') as TIM,DCM FROM ZHOUGX.ttt WHERE ID=?

         if(ret>0) while(!DAU_next(&t_DAU)) {
                   //处理每一行记录,在ttt里
         }
             DAU_free(&t_DAU); //释放DAU
            ___SQL_CloseDatabase(&SQL_Connect);//关闭数据库
           db2_trem();//释放DB2环境句柄
这个应用流程是否够简单?感兴趣可以继续交流,可以提供源码。支持多线程,含连接池操作。
OCI与CLI用法相同,只需要更换底层库。

可以参加SDBC群交流,那个群里提供的OCI包装,db2的刚刚写好,运行效率还是很高的。因为有了OCI的经验。
http://bbs.chinaunix.net/viewthr ... ;page=1#pid13162420
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP