免费注册 查看新帖 |

Chinaunix

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

c操作oracle用什么比较好?嵌入式SQL或OCI或其它 [复制链接]

论坛徽章:
2
午马
日期:2015-01-27 11:22:392015年辞旧岁徽章
日期:2015-03-03 16:54:15
11 [报告]
发表于 2009-11-27 21:30 |只看该作者
比较粉pro* c 的飘过。。

论坛徽章:
0
12 [报告]
发表于 2009-11-27 21:43 |只看该作者
pro* c也很不错,但不知道链接库的块头是多大

[ 本帖最后由 CyberBlue 于 2009-11-27 21:45 编辑 ]

论坛徽章:
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
13 [报告]
发表于 2009-11-29 09:51 |只看该作者
原帖由 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 编辑 ]

论坛徽章:
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
14 [报告]
发表于 2009-11-30 10:09 |只看该作者
原帖由 yulihua49 于 2009-11-29 09:51 发表

看我做的数据库包装器:
完全解决你提的问题。开始名为DTO,后改名为DAU(Data Access Uint),其效果在20页以后。
http://www.itpub.net/thread-1088197-1-1.html
是这个数据库包装器开发的全过程,如需要, ...

上述数据库表模板自动获取过程:


  1. tuxticket@jgbticket:~/config> mkpatt.sh
  2. 输入表名: seat

  3. T_PkgType SEAT_tpl[]={
  4.         {CH_DATE,YEAR_TO_DAY_LEN,"start_date start_date",YEAR_TO_DAY,-1},
  5.         {CH_CHAR,5,"beg_station"},
  6.         {CH_CHAR,13,"train_no"},
  7.         {CH_CHAR,7,"run_train"},
  8.         {CH_DATE,YEAR_TO_MIN_LEN,"on_date ",YEAR_TO_MIN},
  9.         {CH_TINY,1,"carno"},
  10.         {CH_TINY,1,"seat_type"},
  11.         {CH_SHORT,sizeof(short),"seat_no"},
  12.         {CH_SHORT,sizeof(short),"end_station"},
  13.         {CH_SHORT,sizeof(short),"shortest_station"},
  14.         {CH_INT,sizeof(int),"purpose"},
  15.         {CH_CHAR,51,"gride"},
  16.         {CH_CHAR,6,"pro"},
  17.         {CH_TINY,1,"flag"},
  18.         {CH_CHAR,17,"used_dev"},
  19.         {CH_CHAR,17,"used_uid"},
  20.         {CH_TIME,sizeof(INT64),"used_time ",YEAR_TO_SEC},
  21.         {CH_CHAR,20,"ROWID"},
  22.         {-1,0,"SEAT","start_date|beg_station|train_no|carno|seat_no|seat_type|"}
  23. };

  24. extern T_PkgType SEAT_tpl[];
  25. typedef struct {
  26.         char start_date[YEAR_TO_DAY_LEN];
  27.         char beg_station[5];
  28.         char train_no[13];
  29.         char run_train[7];
  30.         char [YEAR_TO_MIN_LEN];
  31.         char carno;
  32.         char seat_type;
  33.         short seat_no;
  34.         short end_station;
  35.         short shortest_station;
  36.         int purpose;
  37.         char gride[51];
  38.         char pro[6];
  39.         char flag;
  40.         char used_dev[17];
  41.         char used_uid[17];
  42.         INT64 ;
  43.         char ROWID[20];
  44. } SEAT_stu;

复制代码

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

论坛徽章:
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
15 [报告]
发表于 2009-11-30 10:40 |只看该作者
原帖由 BetonArmEE 于 2009-11-25 00:04 发表
怎么没人用嵌入式SQL啊,移植性多好啊
OCI太繁复了,还要封装一层,增加架构复杂度和不稳定因素

这就要看水平了,封装的好,对资源进行完善的管理,程序稳定性更高。DAU就使得开发过程简便,程序的健壮性大大提高。

论坛徽章:
0
16 [报告]
发表于 2009-12-01 20:49 |只看该作者
前段时间用过OCCI,性能还不错,至于稳定性,暂时还不是很清楚
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP