现在的位置: 首页 > 综合 > 正文

关于DTL库不能SELECT本地Oracle表的问题

2013年09月18日 ⁄ 综合 ⁄ 共 1198字 ⁄ 字号 评论关闭
过去一直正常的代码,春节后忽然报告错误,连一个普通的Select操作都不能进行:
Exception type: DBException
Method: DBStmt::Fetch()
Error Message: Unable to fetch statment "SELECT CONFIG_COUNT_MAX, CONFIG_SYSTEM_INFO F
ROM SYSCONFIG"
SQL Errors:
(0) SQL Error! SQLSTATE = 07006 Native err = 0 msg = [Oracle][ODBC]Restricted da
ta type attribute violation.

 还有的时候错误信息是Numberic value out of range.

百思不得其解,春节前还好好的,代码没有变过,怎么忽然就不能运行了呢?
首先考虑是不是防火墙的问题,关闭了防火墙试验不行,然后换了一台机器试验,也不行;
然后试验更换Oracle客户端的版本,春节前是用的9i,现在用的是10g,卸载了10g重新装9i,却还是不行;
然后考虑是不是操作系统的变化造成的,过去是Win2000,春节后重新装了WinXP,于是在虚拟机里重新安装了一个Win2000Server、重新安装VC6+SP6试验,还是不行;
对比两个数据库服务器的表结构,没有区别,数据内容虽然不同,但是似乎也没有异常的数据内容;尝试用ADO写了一个访问程序,结果运行通过,可以访问此数据库并且取出数据,莫非是DTL库出问题了?
然后尝试本地又搭建了一个Oracle数据库服务器,导入数据,然后发现程序访问这个数据库还是出一样的错误。
然后尝试连接远程的一个同样的Oracle数据库,结果竟然成功了,于是尝试重启本地Oracle服务,无效;重启本地Oracle服务器,无效;
尝试导入远程数据到本地,程序不出错了。然后导回本地的错误数据,开始逐一将字段值设置为0试验是哪个字段出了问题,最后发现其中一个字段设置为0之后(之前的值是负数 -1),程序可以正确运行了。
查看本地C代码中对应的部分,DTL类中的定义是unsigned long,而数据库中该字段的定义是Numberic,一般来说,C中对unsigned long 赋负数值是不会出错的(虽然逻辑上可能不是你需要的结果),看来DTL库的内容对此有某种处理在,如果赋值和定义不符,则代码抛出异常(First-chance exception in App.exe (KERNEL32.DLL): 0xEBAD562F: (no name).),由于本地程序的定义是从逻辑角度定义的,某些逻辑上不可能为负数的都被定义为unsigned long,而数据库中则统一都是Numberic类型的,这是一种不统一的情况,考虑如果修改代码工作量非常巨大,所以暂时不准备解决此问题,而由前台程序负责保证数据库不要出现异常值(负数)。
整个除错过程历时三天多,眩晕~

抱歉!评论已关闭.