4

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

 3 years ago
source link: https://zhiqiang.org/coding/accessor-is-not-a-parameter-accessor-error.html
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

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

作者: 张志强

, 发表于 2009-11-21

, 共 597 字 , 共阅读 46 次

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

avatar-0.jpg

About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK