- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
C++异常规格与程序core
日期:2010-1-25
作者:李建生
题记:追踪调试问题,上穷碧落下黄泉的感觉。
平台:IBM AIX、VAC(Visual Age C++)、Oracle 10g
关键词:异常、异常规格、core、OCI、非法日期、
摘要:我们的程序查询数据库时,如果遇到非法数据,则一定会core,对于正式上线运行程序,尤其是关键业务(如充值),会造成致命问题。
无论是我们的独立程序、还是CICS中件间程序,在查询oracle数据库时,若是遇到非法日期格式的数据,都会core掉,给我们的工作带来困扰,增加了开发维护工作量。
问题根源是华为的oralce数据库接口表中,对于日期类型的数据,偶尔会有一些日期字段是非法的,不合常规的如:22-24。从兴华为联合体刚割接BOSS时,遇到了大批这样的数据,开发浪费了大量的人力追踪、定位问题,最后统一提给华为修改数据了事。
但是到现在为止虽然没有大量的非法数据出现,但是偶尔还是会有非法数据,使我们的程序出错。如前段时间帐务空中充值程序问题,遇到了非法日期数据,程序一直Core,很短时间内产生了5万左右个文件,给维护带来的很大的工作量。并且还有可能导致充值不成功,引起客户投诉。
我们访问oralce数据库采用的是xdbc,而xdbc是采用oracle的OCI接口实现数据访问的。之前我们无法在测试数据库中生成非法日期数据,导致无法重现测试。后来,也就没有再跟进这个问题了。
今天有压力了(原因不说了),一劳永逸的解决掉这个问题(临时解决方法是不再访问数据库中的日期字段)。先说明一下我们访问数据库的代码结构:
数据访问类DAO(由工具根据建表语句自动生成)直接使用xdbc访问数据库。应用程序可以通过DAO或xdbc来访问数据库。
首先,模拟正式环境运行出错的场景,生成非法日期的数据。Xdbc无法完成这项任务,因为传递给它的一这理是日期对象,而合法的日期才能产生日期对象。再考虑Sqlplus,也不行,只能输入合法的日期。没办法,只有通过写小程序了。接着考虑oracle提供了OCI的接口,检查文档看OCI接口是否支持插入非法数据。
参看红色部分,通过OCI接口调用,OCI不会检查日期的范围,也即是不对合法性进行检查。证明可以通过OCI接口插入非法日期数据。以前不怎么了解OCI,google一把吧。好麻烦啊,现在只能中午上网。中午上网搜了一把,发现有一个参考示例,自己再接合xdbc通过OCE访问数据的方法。写出了插入非法数据的代码:
//将要插入的非法日期
char p_bvi[7]=22-33;
//生成访问OCI的环境
rc = OCIEnvCreate((OCIEnv **) p_env,OCI_DEFAULT,(dvoid *)0,
(dvoid * (*)(dvoid *, size_t)) 0,
(dvoid * (*)(dvoid *, dvoid *, size_t))0,
(void (*)(dvoid *, dvoid *)) 0,
(size_t) 0, (dvoid **) 0);
//登录数据库,使用201的测试机
rc = OCILogon(p_env, p_err, p_svc, jmzw, 4, jmzw, 4, boss15test, 10);
//创建库表create table test_a(a date);
//准备插入SQL语句
strcpy(mysql,insert into test_a values(:x));
rc = OCIStmtPrepare(p_sql, p_err, mysql,
(ub4) strlen(mysql), (ub4) OCI_NTV_SYNTAX, (ub4) OCI_DEFAULT);
//绑定非法数据字段
rc = OCIBindByName(p_sql, p_bnd, p_err, (text *) :x,
-1, (dvoid *) p_bvi, sizeof(p_bvi), SQLT_DAT, (dvoid *) 0,
(ub2 *) 0, (ub2 *) 0, (ub4) 0, (ub4 *) 0, OCI_DEFAULT);
rc = OCIStmtExecute(p_svc, p_sql, p_err, (ub4) 1, (ub4) 0,
//执行插入操作
(CONST OCISnapshot *) NULL, (OCISnapshot
您可能关注的文档
最近下载
- 政务大模型安全治理框架.pptx VIP
- 六年级作文指导课件.pptx VIP
- 水肥一体化技术(稿)教案.ppt VIP
- 【国家标准】GB 50617-2010 建筑电气照明装置施工与验收规范.pdf
- 上海(春秋考)高考英语2025年考纲词汇对照表(共120页)(素材,表格式).docx VIP
- 统编教材(部编版)4年级上册语文全册教学课件.pptx
- 专题02 数轴中的动点问题的七种考法(原卷版)【2025数学常考压轴题上册七年级北师版】.docx VIP
- 第五章 物质的跨膜运输 膜转运蛋白与小分子物质的跨膜运输.ppt VIP
- 活动二《同学们喜欢的文具盒》课件 综合实践活动 二年级上册.pptx VIP
- 广州大学研究生创新能力培养项目资助管理办法-广州大学研究生院.DOC VIP
文档评论(0)