楼主: yulihua49

[PRO*C] 看我做的数据库包装器

[复制链接]
论坛徽章:
14
2009新春纪念徽章
日期:2009-01-04 14:52:28沸羊羊
日期:2015-03-04 14:51:52优秀写手
日期:2014-03-14 06:00:13马上有房
日期:2014-02-18 16:42:022014年新春福章
日期:2014-02-18 16:42:022013年新春福章
日期:2013-02-25 14:51:24ITPUB 11周年纪念徽章
日期:2012-10-09 18:08:15蜘蛛蛋
日期:2012-06-27 21:08:142012新春纪念徽章
日期:2012-01-04 11:53:29ITPUB十周年纪念徽章
日期:2011-11-01 16:23:26
421#
 楼主| 发表于 2009-9-17 10:38 | 只看该作者

回复 #10 yulihua49 的帖子

系统的规模开发已进行了一月余,1个老人,5个新人,培训4小时。
头一周,问题比较多,现在整个团队正常运转,大家使用C、JSON、DAU、TUXEDO都顺利。
系统设计很怪,都使用标号的表名、列名:如:
ASMPP01表,TXPSA001列。。。。。。
DAU提供了列名-伪列名转换机制,在应用程序中使用有意义的伪列名,使开发简化不少。

如:
/*席位余量查询模板*/
T_PkgType seat_remain_tpl[]={
{CH_DATE,YEAR_TO_DAY_LEN,"FSMPS005 on_date",YEAR_TO_DAY,-1},   //上车日期
{CH_CHAR,9,"ADMRP070 trn_no"},                                  //站车次
{CH_CHAR,6,"FSMPS052 beg_stn"},                                 //上车站
{CH_CHAR,6,"FSMPS003 end_stn_code"},                            //下车站
//{CH_CHAR,11,"null purpose"},                                  //用途
{CH_CHAR,3,"ABDAP055 seat_type"},                               //席别
{CH_SHORT,sizeof(short),"SUM(FSMPS010) quantity"},              //数量
{-1,0,"ASMPS02",0}
};
/*席位余量查询结构体*/
typedef struct{
    char on_date[YEAR_TO_DAY_LEN];
    char trn_no[9];
    char beg_stn[6];
    char end_stn_code[6];
//  char purpose[11];
    char seat_type[3];
    short quantity;
}seat_remain_stu;



  1. DAU_init(&t_DAU,&sql,0,&rem,seat_remain_tpl);
  2.      strcpy(rem.on_date,"2009-09-19");
  3.      strcpy(rem.trn_no,"C2271");
  4.      strcpy(rem.beg_stn,"10010");
  5.      strcpy(rem.end_stn_code,"10172");

  6.     p=DAU_mk_where(&t_DAU,"on_date,trn_no,beg_stn,end_stn_code",stmt);
  7.     p+sprintf(p," GROUP BY $on_date,$trn_no,$beg_stn,$end_stn_code,$seat_type ");
  8.     printf("stmt=%s\n",stmt);
  9.     ret=DAU_select(&t_DAU,stmt,0);
  10.     printf("select ret=%d,stmt=%s\n",ret,stmt);
  11.     if(ret>0) {
  12.         while(!DAU_next(&t_DAU)) {
  13.             DAU_pack(&t_DAU,stmt);
  14.             printf("result=%s\n",stmt);
  15.         }
  16.     }
  17.     DAU_free(&t_DAU);

复制代码

生成的语句及结果:
select ret=2,stmt=SELECT  to_char(FSMPS005,'YYYY-MM-DD') on_date,ADMRP070 trn_no,FSMPS052 beg_stn,FSMPS003 end_stn_code,ABDAP055 seat_type,SUM(FSMPS010) quantity FROM TBSDBA.ASMPS02 WHERE FSMPS005=to_date(:1,'YYYY-MM-DD') AND ADMRP070=:2 AND FSMPS052=:3 AND FSMPS003=:4 GROUP BY FSMPS005,ADMRP070,FSMPS052,FSMPS003,ABDAP055
result=2009-09-19|C2271|10010|10172|O|112|
result=2009-09-19|C2271|10010|10172|M|56|

如果没有DAU,你要去写列名列表,变量列表,晕死。

一般情况下 模板是自动生成的,在这个例子里,只有这一列是人工添加的:
{CH_SHORT,sizeof(short),"SUM(FSMPS010) quantity"},              //数量

newkid所说的惯性思维出现了,一些可以联合查询的,大家习惯单表查询,逻辑组合,不过目前没发现效率问题。

DAU使用手册第8节:

8. 复杂SQL语句的应用
DAU允许使用复杂的SQL语句,但仅限于DAU_select和DAU_prepare,并且需要手工建立模板。
支持如下形式的复杂语句:
列值表达式:
在列名字段:"表达式 虚列名"
表达式可以是任何合法的SQL语句,如select语句。在语句中支持bind变量。在表名前可设置属主前缀 $DB. DAU将其替换成数据库属主。
表名表达式:对于普通表名,DAU自动在其前加入数据库属主前缀。复杂表名,通过其含有 空格, DAU不加入数据库属主前缀,需要时在表名前可设置属主前缀 $DB. DAU将其替换成数据库属主。
Where表达式,可以有复杂的子查询,子查询可以使用bind变量,子查询的表名前可设置属主前缀 $DB.  。DAU将其替换成数据库属主。
纯bind变量:列名为:"null 虚列名",仅用于查询前bind查询值,在结果集无意义。

例如,下例涉及3个表:
T_PkgType test_tpl[]={
    {CH_DATE,11,"a.beg_date beg_date","YYYY-MM-DD",-1},
    {CH_CHAR,11,"b.first_name first_name"},
    {CH_CHAR,20,"(select a from $DB.tab3 d  where d.b=:last) last"},
    {-1,0,"$DB.tab1 a,  $DB.tab2 b",0}
};
typedef struct {
    char beg_date[11];
    char first_name[11];
    char last[20];
} test_stu;

DAU_init(&t_DAU,&sql,0,&t,test_tpl);
sprintf(stmt,"where a.first_name=b.first_name and beg_date>:beg_date and a.last_name=(select aa from $DB.tab3 c where c.bb=:first_name) ");
ret=DAU_prepare(&t_DAU,stmt);

生成如下语句:
SELECT  to_char(a.beg_date,'YYYY-MM-DD') beg_date,b.first_name first_name,(select a from TICKET.tab3 d  where d.b=:1) last FROM TICKET.tab1 a,  TICKET.tab2 b where a.first_name=b.first_name and beg_date>to_date(:2,'YYYY-MM-DD') and a.last_name=(select aa from TICKET.tab3 c where c.bb=:3)

[ 本帖最后由 yulihua49 于 2009-9-17 11:10 编辑 ]

使用道具 举报

回复
论坛徽章:
520
奥运会纪念徽章:垒球
日期:2008-09-15 01:28:12生肖徽章2007版:鸡
日期:2008-11-17 23:40:58生肖徽章2007版:马
日期:2008-11-18 05:09:48数据库板块每日发贴之星
日期:2008-11-29 01:01:02数据库板块每日发贴之星
日期:2008-12-05 01:01:03生肖徽章2007版:虎
日期:2008-12-10 07:47:462009新春纪念徽章
日期:2009-01-04 14:52:28数据库板块每日发贴之星
日期:2009-02-08 01:01:03生肖徽章2007版:蛇
日期:2009-03-09 22:18:532009日食纪念
日期:2009-07-22 09:30:00
422#
发表于 2009-9-17 22:09 | 只看该作者
好久没跟你抬杠了,别来无恙?

系统设计很怪,都使用标号的表名、列名:如:
ASMPP01表,TXPSA001列。。。。。。
DAU提供了列名-伪列名转换机制,在应用程序中使用有意义的伪列名,使开发简化不少。

这纯粹是自讨苦吃。
碰到这样的设计我第一件事就是在所有的表上建一个视图,把所有的表名、列名改为人类看得懂的名字。以后就用视图代替表。



如:
/*席位余量查询模板*/
...........
/*席位余量查询结构体*/
..............
如果没有DAU,你要去写列名列表,变量列表,晕死。

恰恰相反,就简洁读、可读性而言,这个例子比存储过程里写SQL不知道差了多少。

DAU使用手册第8节:

8. 复杂SQL语句的应用
DAU允许使用复杂的SQL语句,但仅限于DAU_select和DAU_prepare,并且需要手工建立模板。
.......

此处要求程序员知道怎么写SQL, 还要知道怎么样才能让这个“包装器”最后生成出来的SQL是他想要的,比起直接写SQL,绕这个弯完全没有必要。

使用道具 举报

回复
论坛徽章:
40
技术图书徽章
日期:2023-02-28 10:16:02暖羊羊
日期:2015-02-10 17:19:24马上有房
日期:2015-01-12 10:57:17ITPUB社区OCM联盟徽章
日期:2014-08-27 17:33:52青年奥林匹克运动会-帆船
日期:2014-08-27 13:50:412014年世界杯参赛球队: 哥伦比亚
日期:2014-07-10 14:10:592014年世界杯参赛球队:墨西哥
日期:2014-06-24 10:38:072014年世界杯参赛球队: 加纳
日期:2014-06-23 13:12:032014年世界杯参赛球队: 美国
日期:2014-05-21 08:18:36沸羊羊
日期:2015-03-04 14:51:52
423#
发表于 2009-9-18 10:26 | 只看该作者
想学,不知道怎么入门呀

使用道具 举报

回复
论坛徽章:
0
424#
发表于 2009-9-18 19:17 | 只看该作者
原帖由 newkid 于 2009-9-17 22:09 发表
好久没跟你抬杠了,别来无恙?


这纯粹是自讨苦吃。
碰到这样的设计我第一件事就是在所有的表上建一个视图,把所有的表名、列名改为人类看得懂的名字。以后就用视图代替表。




恰恰相反,就简洁读、可读性而言,这个例子比存储过程里写SQL不知道差了多少。


此处要求程序员知道怎么写SQL, 还要知道怎么样才能让这个“包装器”最后生成出来的SQL是他想要的,比起直接写SQL,绕这个弯完全没有必要。

你好,最近很忙,不时加班到深夜。来的少了。潜潜水,看到你经常在此耕耘,甚慰。
数据是其它部门设计,我们只有屈服。你的办法也很好,对效率不会有什么影响吧?(设计者怕外人通过表结构窥测系统数据以至于分析出系统功能,恐怕不能允许我们建立翻译视图,服务器的源程序,外人是看不见的,在源程序中翻译列名他们是认可的)。
好,或不好,已经不是问题,你我不同的思路,适合不同人群。
前边所说,DAU是否使程序员变傻问题,似乎不存在。因为DAU只做了低级的重复性劳动,程序员从这些简单劳动中解脱出来,有更多的精力研究SQL的精髓。
复杂的SQL语句,在DAU里被分解为column表达式,表名表达式,where表达式,结构更清晰。
“此处要求程序员知道怎么写SQL, 还要知道怎么样才能让这个“包装器”最后生成出来的SQL是他想要的,比起直接写SQL,绕这个弯完全没有必要。” -- 前边的那些语句不是我写的哦!是我们一位此前从未接触过SQL的新学员写的。有无必要?你已经在这个舞台上了,就只能这么跳,我保证这个舞台什么舞都能跳,其余的,是你要小心,别跳到乐池里去。

现在,DAU主要缺点是CLOB和BLOB不能处理,如果一定要处理,就只有剥离包装直接使用sqlora8.好在OLTP程序较少涉及BLOB。

[ 本帖最后由 yulihua49_cu 于 2009-9-18 19:53 编辑 ]

使用道具 举报

回复
论坛徽章:
0
425#
发表于 2009-9-18 19:23 | 只看该作者
原帖由 maolinxie 于 2009-9-18 10:26 发表
想学,不知道怎么入门呀

过几天上班给你准备些资料你先看看,如果你觉得有用,我再给你程序包。因为现在程序还比较凌乱,需要整理。

使用道具 举报

回复
论坛徽章:
520
奥运会纪念徽章:垒球
日期:2008-09-15 01:28:12生肖徽章2007版:鸡
日期:2008-11-17 23:40:58生肖徽章2007版:马
日期:2008-11-18 05:09:48数据库板块每日发贴之星
日期:2008-11-29 01:01:02数据库板块每日发贴之星
日期:2008-12-05 01:01:03生肖徽章2007版:虎
日期:2008-12-10 07:47:462009新春纪念徽章
日期:2009-01-04 14:52:28数据库板块每日发贴之星
日期:2009-02-08 01:01:03生肖徽章2007版:蛇
日期:2009-03-09 22:18:532009日食纪念
日期:2009-07-22 09:30:00
426#
发表于 2009-9-18 21:32 | 只看该作者
原帖由 yulihua49_cu 于 2009-9-18 19:17 发表

数据是其它部门设计,我们只有屈服。你的办法也很好,对效率不会有什么影响吧?(设计者怕外人通过表结构窥测系统数据以至于分析出系统功能,恐怕不能允许我们建立翻译视图,服务器的源程序,外人是看不见的,在源程序中翻译列名他们是认可的)。

这种简单的包装视图对效率完全没有影响。
我对你们这个“其他部门”很不理解。"外人”怎么可以进入到数据库看表结构?能够登录到数据库的只有用户和开发商。你们的意思是把最终用户当“外人”,不想让他们掌握系统设计思想?如果是这个意思,那么迟早要吃苦头。用户是数据的真正主人,越让他们了解,以后就越顺利。

好,或不好,已经不是问题,你我不同的思路,适合不同人群。
前边所说,DAU是否使程序员变傻问题,似乎不存在。因为DAU只做了低级的重复性劳动,程序员从这些简单劳动中解脱出来,有更多的精力研究SQL的精髓。
复杂的SQL语句,在DAU里被分解为column表达式,表名表达式,where表达式,结构更清晰。

分解后更清晰?我看到的是好端端的一个SQL被你肢解成很多块,可读性大大下降,根本谈不上清晰。比如更早些时候,你的例子代码中经常在半路杀出个拼接WHERE的语句,这对我来说就是阅读障碍,因为我看不到SQL的其他部分,必须往前找。

“此处要求程序员知道怎么写SQL, 还要知道怎么样才能让这个“包装器”最后生成出来的SQL是他想要的,比起直接写SQL,绕这个弯完全没有必要。” -- 前边的那些语句不是我写的哦!是我们一位此前从未接触过SQL的新学员写的。有无必要?你已经在这个舞台上了,就只能这么跳,我保证这个舞台什么舞都能跳,其余的,是你要小心,别跳到乐池里去。

如果你的程序员知道可以脱掉镣铐跳舞,那么他一定会跳得更加精彩。

使用道具 举报

回复
论坛徽章:
14
2009新春纪念徽章
日期:2009-01-04 14:52:28沸羊羊
日期:2015-03-04 14:51:52优秀写手
日期:2014-03-14 06:00:13马上有房
日期:2014-02-18 16:42:022014年新春福章
日期:2014-02-18 16:42:022013年新春福章
日期:2013-02-25 14:51:24ITPUB 11周年纪念徽章
日期:2012-10-09 18:08:15蜘蛛蛋
日期:2012-06-27 21:08:142012新春纪念徽章
日期:2012-01-04 11:53:29ITPUB十周年纪念徽章
日期:2011-11-01 16:23:26
427#
 楼主| 发表于 2009-9-21 10:19 | 只看该作者
原帖由 maolinxie 于 2009-9-18 10:26 发表
想学,不知道怎么入门呀

SDBC,安全数据库连接,是基础,重点看数据库包装部分。
DAU在其上,利用SDBC的数据库资源,提供更高级的包装操作。
JSON是工具,目前系统提倡使用这种格式,在DAU里提供了支持。

[ 本帖最后由 yulihua49 于 2009-9-21 10:55 编辑 ]

数据包装器.jpg (32.97 KB, 下载次数: 8)

数据包装器.jpg

SDBC说明书(修改).doc

230.8 KB, 下载次数: 2

DAU.doc

75.5 KB, 下载次数: 6

JSON.doc

18.5 KB, 下载次数: 5

使用道具 举报

回复
论坛徽章:
407
紫蛋头
日期:2012-05-21 10:19:41迷宫蛋
日期:2012-06-06 16:02:49奥运会纪念徽章:足球
日期:2012-06-29 15:30:06奥运会纪念徽章:排球
日期:2012-07-10 21:24:24鲜花蛋
日期:2012-07-16 15:24:59奥运会纪念徽章:拳击
日期:2012-08-07 10:54:50奥运会纪念徽章:羽毛球
日期:2012-08-21 15:55:33奥运会纪念徽章:蹦床
日期:2012-08-21 21:09:51奥运会纪念徽章:篮球
日期:2012-08-24 10:29:11奥运会纪念徽章:体操
日期:2012-09-07 16:40:00
428#
发表于 2009-9-21 10:22 | 只看该作者
nice

使用道具 举报

回复
论坛徽章:
14
2009新春纪念徽章
日期:2009-01-04 14:52:28沸羊羊
日期:2015-03-04 14:51:52优秀写手
日期:2014-03-14 06:00:13马上有房
日期:2014-02-18 16:42:022014年新春福章
日期:2014-02-18 16:42:022013年新春福章
日期:2013-02-25 14:51:24ITPUB 11周年纪念徽章
日期:2012-10-09 18:08:15蜘蛛蛋
日期:2012-06-27 21:08:142012新春纪念徽章
日期:2012-01-04 11:53:29ITPUB十周年纪念徽章
日期:2011-11-01 16:23:26
429#
 楼主| 发表于 2009-9-21 10:24 | 只看该作者
原帖由 newkid 于 2009-9-18 21:32 发表

这种简单的包装视图对效率完全没有影响。
我对你们这个“其他部门”很不理解。"外人”怎么可以进入到数据库看表结构?能够登录到数据库的只有用户和开发商。你们的意思是把最终用户当“外人”,不想让他们掌握系统设计思想?如果是这个意思,那么迟早要吃苦头。用户是数据的真正主人,越让他们了解,以后就越顺利。


分解后更清晰?我看到的是好端端的一个SQL被你肢解成很多块,可读性大大下降,根本谈不上清晰。比如更早些时候,你的例子代码中经常在半路杀出个拼接WHERE的语句,这对我来说就是阅读障碍,因为我看不到SQL的其他部分,必须往前找。


如果你的程序员知道可以脱掉镣铐跳舞,那么他一定会跳得更加精彩。

穿着潜水服跳舞,脱不得,会死。

我指的潜水服是数据结构(struct),不管你用DAU,或者不用,你必须把语句和结果集与struct关联起来,DAU提供了方便的关联方法,共同的关联模板,使得较大规模的开发团队面向一致的数据结构和规范化的处理方法,这种约束对大家都是一种方便。否则,一切后续操作无法进行。你不仅要看到SQL是怎样使用的,更应该看到在整个服务器系统里,C语言是怎样组织起来的,怎样在一大堆生手中产生可靠的,一致的,避免互相冲突的程序。通过DAU,我们实现了这一点。DAU提供的工具,大大提高了C程序产品的可靠性,降低了开发、调试成本。

如果没有DAU,当把结果集一个个数据装入结构,不仅繁琐,而且,对于新手而言,很容易出现不恰当的类型和值越界,有时这种故障极难查找

切记,我提出问题的关键是面向数据结构,与OO概念类似,因为是C,没有对象,所以,本帖提出的是SO方法。
现在,不讨论SO是否必要,而是SO如何实现。
这个C 的SO方法,很容易变为C++的OO方法。
我很乐意大家能够提出或实现不同的SO方法,或SRM(数据结构与关系数据库的映射)方法。

你在提出这没必要那没必要的时候,请给我一种方法,把数据库与C数据结构关联起来?

[ 本帖最后由 yulihua49 于 2009-9-21 11:11 编辑 ]

使用道具 举报

回复
论坛徽章:
520
奥运会纪念徽章:垒球
日期:2008-09-15 01:28:12生肖徽章2007版:鸡
日期:2008-11-17 23:40:58生肖徽章2007版:马
日期:2008-11-18 05:09:48数据库板块每日发贴之星
日期:2008-11-29 01:01:02数据库板块每日发贴之星
日期:2008-12-05 01:01:03生肖徽章2007版:虎
日期:2008-12-10 07:47:462009新春纪念徽章
日期:2009-01-04 14:52:28数据库板块每日发贴之星
日期:2009-02-08 01:01:03生肖徽章2007版:蛇
日期:2009-03-09 22:18:532009日食纪念
日期:2009-07-22 09:30:00
430#
发表于 2009-9-21 23:02 | 只看该作者
你在提出这没必要那没必要的时候,请给我一种方法,把数据库与C数据结构关联起来?

我不反对你用你的DAU方法去把数据库和C数据结构作映射;我只是不赞成你把事务处理拿到C里面去完成,也不赞成把复杂SQL分解成许多单表、嵌套游标的操作。
在我看来应该大量适用存储过程,存储过程里写复杂SQL是轻而易举,这是PLSQL的天生优势。
存储过程的计算结果你完全可以再用你的方法拿到C里去使用。但是我认为剩下的就是简单的输出而已,没什么事务逻辑需要实现。如果按我的思路来做,我不知道你的包装器还能起多大作用。

使用道具 举报

回复

您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

TOP技术积分榜 社区积分榜 徽章 团队 统计 知识索引树 积分竞拍 文本模式 帮助
  ITPUB首页 | ITPUB论坛 | 数据库技术 | 企业信息化 | 开发技术 | 微软技术 | 软件工程与项目管理 | IBM技术园地 | 行业纵向讨论 | IT招聘 | IT文档
  ChinaUnix | ChinaUnix博客 | ChinaUnix论坛
CopyRight 1999-2011 itpub.net All Right Reserved. 北京盛拓优讯信息技术有限公司版权所有 联系我们 未成年人举报专区 
京ICP备16024965号-8  北京市公安局海淀分局网监中心备案编号:11010802021510 广播电视节目制作经营许可证:编号(京)字第1149号
  
快速回复 返回顶部 返回列表