5

我在尝试在 NET (c#) 中获取这个简单 sql 查询的结果时遇到了一个问题:

select 1/3 as col from dual

OracleDataReader.GetValue(i)抛出异常:

Arithmetic operation resulted in an overflow.
at Oracle.DataAccess.Types.DecimalConv.GetDecimal(IntPtr numCtx)
at Oracle.DataAccess.Client.OracleDataReader.GetDecimal(Int32 i)
at Oracle.DataAccess.Client.OracleDataReader.GetValue(Int32 i)

我发现当数字精度超过 28 位时会发生此错误,因此会导致错误:

select round(1/3,29) as col from dual

但这不会

select round(1/3,28) as col from dual

尝试将 c# 中的列值视为 Double 得到错误“无效转换”

除了无处不在的数字列四舍五入之外,有谁知道避免这种情况的任何方法?

4

2 回答 2

2

由于数据类型是十进制,它必须是精确的。不可能以十进制类型存储 1/3 无限小数。一般来说,如果转换结果不能表示为 Decimal ,则从 Single 或 Double 到 Decimal 的转换会引发 OverflowException。因此,我需要将此值读取为双精度值,或者确保它是正确的小数。

于 2012-04-11T10:11:19.943 回答
0

您应该先检查以下链接,可能需要添加补丁。

http://www.chriscolotti.us/vmware/gotcha-upgrading-vcenter-4-1-to-5-0-with-oracle-11gr2-may-need-client-patch/

于 2012-04-11T11:20:30.973 回答