1

我遇到了 Delphi 6 + Oracle 10gR2 + ADO + ClientDataSet 的问题。

每当我在字段 NUMBER(19,9) 上运行聚合函数时,生成的列都会向 Delphi 返回一个 NUMBER 数据类型,在某些机器上它加载为精度为 38 的 TBCDField,一切顺利,但在某些机器上它加载为精度为 255 的 TBCDField,并且我在该字段上得到 BCD 溢出。

要复制该问题,只需创建一个包含 NUMBER (19,9) 列的表,然后运行 ​​SELECT SUM( column_name ) column_name FROM table_name GROUP BY column_name

尽管该列是 NUMBER(19,9),但结果列将是一个未定义精度的 NUMBER。

在 Delphi 中,将查询加载到 ADOQuery 中,DataSetProvider 链接到它,ClientDataSet 链接到 DataSetProvider。在我调用 ClientDataSet.Open 后,在某些机器上,我在 NUMBER 字段上收到 BCD 溢出消息,但在很多机器上它工作得很好。

当 midas.dll、ADO、服务器、用户、oracle 客户端在两台机器上都相同时,为什么我在某些机器上得到了 255 精度?有任何想法吗?

4

2 回答 2

1

尝试类型转换

Select **CAST(NUMBER_FLD as VARCHAR2(15))** as NUMBER_FLD from DUAL;

在 Delphi 上,是一个StringField(ClientDataset) 组件,但如果您通过别名获取,则喜欢CdsOracleSQL.FieldByname('NUMBER_FLD').AsFloatCdsOracleSQLNUMBER_FLD.AsFloat工作。

我不知道为什么BCDField会丢失小数点分隔符并且像整数一样工作......

于 2014-05-15T18:45:03.793 回答
0

我对你没有任何明确的答案,但你确定你在两台机器上都有相同版本的客户端 dll 吗?可能安装了其他干扰软件。尝试在客户端计算机上运行Windows Process Explorer并确认您认为您正在使用的 dll 是您的客户端应用程序实际使用的那些。

于 2009-07-17T22:54:33.663 回答