Oracle:存取器不是参数存取器或列值被截断

作者: , 共 597 字 , 共阅读 0

最近写一个 vba 程序的时候不间歇的出现 「存取器不是参数存取器 」或者「列值被截断」的错误。后来发现对于我等不专业人士,遇到这样的错误还挺 e 的。下面是综合各种资料了解到的一些东西。

问题多出现在有乘法或者除法或者其它产生高精度小数的时候,这类错误应该是 Oracle 和 vba 里的数据精度不一致导致的, Oracle 里的数据精度为 38 位,而微软 VB ADO 系统的精度最高只能支持 28 位的精度,导致对接出了问题。具体可见http://support.microsoft.com/?scid=kb;en-us;327557&x=16&y=11

目前两个解决方案:

1. 不要用 Oracle 客户端自带的 Ole 驱动,用微软的 Old 驱动。

Provider=MSDAORA

这个应该是微软提供的驱动解决了数据连接的问题。这个方法基本上解决了大部分问题,但麻烦在于微软自带的驱动不支持 Oracle 一些功能,比如调用某些存储过程。

2. 直接改查询语句,利用 trunc 和 round 函数,将所有可能产生高精度数值的结果主动截断。

select trunc(1.11231234122312, 3) from dual

这个方法是有效的,但是我觉得很奇怪,上面的截断是用十进制位数,但保存的时候应该是二进制的,十进制的截断代表什么意思呢?

Q. E. D.

类似文章:
2014-03-25 更新:我已经将该类修改成函数形式,并增加新功能,参见更新 Excel 的数据库查询函数库
Matlab 的 database 工具箱只支持 ODBC 数据库连接,在使用之前需要先设置 ODBC 数据源。之前在 Excel 里用的是 ADODB ,使用 ADODB 的好处是无需设置 ODBC 源,似乎效率也要高一些(但我一直没弄懂 ADODB 是什么东西,所以效率这东西我也说不清)。
编程 » Excel, lotus, VBA
公司使用 Lotus ,我每天都通过 Excel 编写 VBA 代码自动调用 Lotus 发送邮件,发现一个奇怪的现象。一般我们通过下面的 VBA 代码指定邮件收件人:
更新一下之前写的Excel 的数据库类,将其改成函数的形式,调用更简单(省却了生成类实例的步骤)。现在这个代码在工作中用了一年多,已经比较健壮。若有问题,请留言指出或与我联系。
编程 » Excel, VBA
VBA 的 Date 类型比较奇怪。
编程 » C++, GCC, 编译链接
LD 在链接生成目标文件时,会从左到有扫描输入的依赖库,当依赖库之间也有依赖关系时,必须将「依赖别人的库」放在「被别人依赖的库」的前面。否则会链接失败!失败的症状有:
编程 » Excel, VBA
无意中发现一个 Excel VBA 对待参数的一个"不正常"现象。这种处理方式可能无意中导致程序结果错误,而且你很难发现你的错误所在:
一定要先座这一几步,否则直接用pypyodbc会爆下面错误:
理论计算机(I)课上讲的一个问题,很有意思。
碎碎念 » 大学生, 大学
这个入学指南比较特别,给今年入学或者低年级的同学看看。
编程 » Excel, VBA
VBA 的 Date 类型比较奇怪。