C++异常规格与程序core).doc

  1. 1、本文档共5页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
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

您可能关注的文档

文档评论(0)

xiaofei2001127 + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档