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