- 1、本文档共5页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 5、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 6、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 7、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 8、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
您可能关注的文档
最近下载
- 睿能热泵热水机安装手册-上海海立睿能.PDF
- 林业系统事业单位招聘考试《林业知识》真题库及答案1000题(参考).docx VIP
- 铁路客运车站标识系统暂行技术条件.doc VIP
- 基于产教融合背景下的高职汽车专业建设研究.pptx VIP
- 金银花生产技术规程.pdf VIP
- 山东省青岛实验高中2024届高一数学第二学期期末统考试题含解析.doc VIP
- 青岛《海绵城市设施运行维护导则》(2019修订版).pdf
- 2025年人教版小学六年级数学下册奥数竞赛测试考试题(附答案解析).docx VIP
- 课程思政教学比赛案例:《数字电子技术》课程.docx VIP
- 巧克力糖自动包装机.doc VIP
文档评论(0)