11

我知道互联网上有几个关于这个问题的主题和帖子,我已经阅读了它们(不是每一篇文章,我不得不承认)但没有一个能让我完全满意。

我的情况:
我使用 ODP.net(dll 版本 2.111.6.0)来访问 Oracle DB(版本 10 + 11)和 DataReader 来检索数据(.NET 3.5,C#)。

使用此代码会导致“ System.OverflowException(算术运算导致溢出。)


decimal.TryParse(oraReader.GetOracleDecimal(0).Value.ToString(), 
  NumberStyles.Any, null, out parsedOraDecimal)

这个结果的值为' 3,00000000000000000000000000000000000000000000000000000000000E-126 '


decimal.TryParse(oraReader.GetOracleValue(0).ToString(), 
  NumberStyles.Any, null, out parsedOraDecimal)

现在我必须找到一些方法来正确检索和评估这个值——数据库也被其他不受我控制的应用程序使用,因此不可能进行更改。

将我的 C# 代码中的类型从“十进制”转换为“双精度”也不是一个真正的选择。

有任何想法吗?

4

2 回答 2

16

OracleDecimal 的精度高于十进制。因此,您必须首先降低精度。忘记所有的解析,使用隐式转换。尝试以下(未经测试):

decimal d = (decimal)(OracleDecimal.SetPrecision(oraReader.GetOracleDecimal(0), 28));
于 2009-12-15T10:14:31.020 回答
9

我刚刚遇到了类似的问题,并尝试了更改 OracleDataAdapter 以返回 Oracle 特定类型( data_adapter.ReturnProviderSpecificTypes = true; )的方法,但这只是一个 PITA,您最终会将 OracleStrings 转换回字符串等。

最后,我通过使用 Oracle 的 round 函数在 SQL 语句中进行精确舍入来解决它:

SELECT round( myfield, 18 ) FROM mytable

然后,Dotnet 会愉快地将数字转换为小数。

于 2010-03-10T10:00:51.600 回答