免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: BetonArmEE
打印 上一主题 下一主题

[C] [开源]C结构体工具DirectStruct,更新至v1.3.0 [复制链接]

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
51 [报告]
发表于 2014-10-13 22:04 |只看该作者
提示: 作者被禁止或删除 内容自动屏蔽

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
52 [报告]
发表于 2014-10-13 22:11 |只看该作者
提示: 作者被禁止或删除 内容自动屏蔽

论坛徽章:
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
53 [报告]
发表于 2014-10-14 16:21 |只看该作者
本帖最后由 yulihua49 于 2014-10-14 16:31 编辑
BetonArmEE 发表于 2014-10-13 16:45
回复 47# yulihua49
    1.开发人员长期不接触SQL,需要直接查数据库时连一些基本SQL都不会了。
    2.那套语法只支持单表查询,只能生成简单的sql对应的调用oci函数,对付核算系统足够了,但是管理系统和数据抽取分析需要写复杂SQL就不行了,最后不得手工调用oci函数来做,搞的很累。

第一个问题,没办法。电脑就是培养懒蛋+笨蛋的工具。我自己已经被培养的懒得不行,笨得不行了。
第二个问题,SDBC可以写复杂语句,多表,虚表都可以。where ,order by,group by,with..as..,分析函数,hint。。。。。都需要你写,我支持。
  1. static T_PkgType TAB_COLUMNS_tpl[]={
  2.         {CH_CHAR,49,"c.TABLE_NAME Fld_Tlb_Name",0,-1},
  3.         {CH_CHAR,49,"c.COLUMN_NAME  Fld_Column_Name"},
  4.         {CH_CHAR,31,"c.DATA_TYPE Fld_Column_Type"},
  5.         {CH_SHORT,sizeof(short),"DATA_LENGTH Fld_Column_Len"},
  6.         {CH_SHORT,sizeof(short),"DATA_PRECISION"},
  7.         {CH_SHORT,sizeof(short),"c.DATA_SCALE Data_Scale"},
  8.         {CH_SHORT,sizeof(short),"k.POSITION Fld_PK"},
  9.         {-1,0,"ALL_TAB_COLUMNS c, "                             //表名表达式
  10.               "(SELECT C2.TABLE_NAME,C2.COLUMN_NAME,C2.POSITION "
  11.               "FROM USER_CONSTRAINTS C1,USER_CONS_COLUMNS C2 "
  12.               "WHERE C1.OWNER = :Fld_Column_Name AND "
  13.               "C1.TABLE_NAME=:Fld_Tlb_Name AND C1.CONSTRAINT_TYPE='P' AND "
  14.               "C2.CONSTRAINT_NAME=C1.CONSTRAINT_NAME) k ",0}
  15. };

  16. /* auto make pattern */

  17. static int descDAO(DAU *DP,char *stmt)
  18. {
  19. int ret;

  20. // 如果是其它数据库,要改。
  21.         strcpy(stmt,"WHERE c.TABLE_NAME = k.TABLE_NAME(+) "
  22.                  "AND c.COLUMN_NAME = k.COLUMN_NAME(+) "
  23.                  "AND c.OWNER = :Fld_Column_Name AND c.TABLE_NAME=:Fld_Tlb_Name "
  24.                  "ORDER BY c.TABLE_NAME, c.COLUMN_ID ");
  25. //      DP->srm.hint="/*+client_result_cache*/";
  26.         ret=DAU_select(DP,stmt,0);
  27.         if(ret<=0) ShowLog(1,"descDAO:DAU_select err=%d,%s",
  28.                 DP->SQL_Connect->Errno,DP->SQL_Connect->ErrMsg);
  29.         return ret;
  30. }
复制代码
以上是SDBC内部分析表结构用到的DAO。

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
54 [报告]
发表于 2014-10-14 18: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
55 [报告]
发表于 2014-10-15 10:49 |只看该作者
本帖最后由 yulihua49 于 2014-10-15 11:00 编辑
BetonArmEE 发表于 2014-10-14 18:09
回复 53# yulihua49

你的方法是原生态的,当然是没问题的。
我是需要将复杂SQL分解,每一个成分要对应到结构里的一个成员。要把关系映射到结构,这一步必须要做,没办法。
我的意思是说,SRM,是可以映射复杂的SQL语句的。
我那个 :变量名,不是宿主变量,而是模板里的列名,通过模板映射到结构中的成员。

你的,INTO  。。。。。一大堆的宿主变量,你是怎么映射到结构的?
当年我就是解决不了这个问题。用describe也不行。

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
56 [报告]
发表于 2014-10-15 18:14 |只看该作者
提示: 作者被禁止或删除 内容自动屏蔽

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
57 [报告]
发表于 2014-10-16 07:44 |只看该作者
提示: 作者被禁止或删除 内容自动屏蔽

论坛徽章:
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
58 [报告]
发表于 2014-10-16 13:27 |只看该作者
本帖最后由 yulihua49 于 2014-10-16 13:32 编辑

[quote]BetonArmEE 发表于 2014-10-16 07:44
我详细说明下DirectStruct自动生成的ESQL代码片段与应用层之间引用的关系吧


明白了。语句是手工写的,代码是自动编的。
我的是代码是事先手工写的,语句是自动编的。

不过这个代码在PRO*C上试过吗?好像有问题。

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
59 [报告]
发表于 2014-10-16 13:46 |只看该作者
提示: 作者被禁止或删除 内容自动屏蔽

论坛徽章:
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
60 [报告]
发表于 2014-10-16 14:54 |只看该作者
本帖最后由 yulihua49 于 2014-10-16 16:17 编辑
BetonArmEE 发表于 2014-10-16 13:46
你说的语句和代码是什么意思?

pro*c没试过,我的原生环境是PostgreSQL,理论上只要遵循ESQL标准应该 ...

语句就是SQL语句,代码就是C程序代码。
恐怕不同的数据库需要不同的代码生成器。

总体来说,你的代码量不大,比我的要好改一些。

02.SQLACTION       "UPDATE userinfo SET * WHERE user_id =" 。。。。。。。。。。。。。。。。。。这个恐怕不行吧?

UPDATE  userinfo set user_name=:user_name,user_email=:user_email,user_use_time=to_date(:user_use_time,'YYYY-MM-DD HH24:MI:SS') where user_id=:user_id;

user_use_time=to_date(:user_use_time,'YYYY-MM-DD HH24:MI:SS' )   .......  这个是我添的,实例ORACLE和DB2的特殊之处。
在生成SQL语句时,要针对不同的数据库的特殊格式。

一个表,有几个日期时间列,不同的格式,写这个,很烦。所以有语句生成器就方便多了。

甚至:
where beg_date <= :beg_date and end_date >= :beg_date    .....  手写的。
经过语句生成器,自动变成:
where beg_date <= to_date(:beg_date,'YYYY-MM-DD') and end_date >= to_date(:beg_date,'YYYY-MM-DD')    .....
生成器看到了模板中的数据类型和格式。
DB2会变成:
where beg_date <= to_date(?,'YYYY-MM-DD') and end_date >= to_date(?,'YYYY-MM-DD')  

SYBASE、MYSQL和这个又不一样,有他们的格式。不同数据库的生成器不同,应用代码不需要怎么变化。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP