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

作者:

最近写一个 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.

类似文章:
更新一下之前写的 Excel 的数据库类 ,将其改成函数的形式,调用更简单(省却了生成类实例的步骤)。现在这个代码在工作中用了一年多,已经比较健壮。若有问题,请留言指出或与我联系。
编程 » Excel, 数据库
在前面的文章里,我已经提到 Excel 数据本身可以当做一张 SQL 查询的数据表 ,并在 Excel 内进行数据库运算操作。数据库查询函数可以用我之前写的 Excel 数据库操作函数类 。我们可以用以下方式
编程 » VBA, Excel
如果不提供错误处理方法, VBA在出错时会停留在出错之处。Excel/VBA 提供 On Error关键词来处理程序运行过程中的错误,具体有下面两种用法:
编程 » Excel, VBA
无意中发现一个 Excel VBA 对待参数的一个"不正常"现象。这种处理方式可能无意中导致程序结果错误,而且你很难发现你的错误所在:
编程 » Excel, VBA
Excel VBA 出错时给出的错误信息极少,需要充分利用各种工具来进行调试。
碎碎念 » 大学生, 大学
这个入学指南比较特别,给今年入学或者低年级的同学看看。
编程 » Excel, VBA
VBA 的 Date 类型比较奇怪。