Oracle数字到C#十进制的转换

11

我知道互联网上有很多关于这个问题的帖子和文章,并且我已经阅读了它们(我必须承认并不是每篇都看了),但没有一个完全满足我的要求。

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

使用这段代码会导致 'System.OverflowException (Arithmetic operation resulted in an overflow.)' 错误。


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

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


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

现在我必须找到一种适当的方法来检索和评估这个值 - 数据库也被用于其他我无法控制的应用程序,因此不能在那里进行更改。

将我的C#代码中的类型从“decimal”转换为“double”也不是真正的选项。

有什么想法吗?

2个回答

16

OracleDecimal比decimal的精度更高。因此,您需要先减少精度。忘掉所有的解析,使用隐式转换。尝试以下代码(未经过测试):

decimal d = (decimal)(OracleDecimal.SetPrecision(oraReader.GetOracleDecimal(0), 28));

8
我很讨厌Oracle;所以每个人都只想要一个普通的十进制数,但是Oracle却让我们绕了好几个弯。 - user117499
1
谢谢,我用这个作为我的解决方案。第一次使用Oracle提供程序并不愉快... - Etch
2
eschneider:在C#被发明之前,Oracle拥有更大的精度,因此他们必须做一些允许使用数据库提供的完整精度的事情。 - Erich Kitzmueller

9

我刚遇到了类似的问题,并尝试改变OracleDataAdapter返回Oracle特定类型的方法(data_adapter.ReturnProviderSpecificTypes = true;),但这只是一种麻烦事情,你最终还要将OracleStrings强制转换为字符串等。

最后,我通过在SQL语句中使用Oracle的round函数来解决精度舍入的问题:

SELECT round( myfield, 18 ) FROM mytable

Dotnet会愉快地将数字转换为十进制数。

1
这在非常大的数字上失败了。 - Stig

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接