C# 甲骨文数字到十进制

C# 甲骨文数字到十进制,c#,oracle,decimal,odp.net,overflowexception,C#,Oracle,Decimal,Odp.net,Overflowexception,我知道互联网上有很多关于这个问题的帖子和帖子,我也读过(我不得不承认,不是每一篇文章),但没有一篇能让我完全满意 我的处境: 我正在使用ODP.net(dll版本2.111.6.0)访问Oracle数据库(版本10+11),并使用DataReader检索数据(.net 3.5,C#) 使用此代码会导致“System.OverflowException(算术运算导致溢出)。” 这个结果的值是“30000000000000000000000000000000000000000000000000000

我知道互联网上有很多关于这个问题的帖子和帖子,我也读过(我不得不承认,不是每一篇文章),但没有一篇能让我完全满意

我的处境:
我正在使用ODP.net(dll版本2.111.6.0)访问Oracle数据库(版本10+11),并使用DataReader检索数据(.net 3.5,C#)

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

这个结果的值是“30000000000000000000000000000000000000000000000000000000000e-126”

现在,我必须找到一些方法来正确地检索和评估这个值-DB也从我无法控制的其他应用程序中使用,因此无法进行更改

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


有什么想法吗?

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


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

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

SELECT round( myfield, 18 ) FROM mytable

Dotnet会很高兴地将数字转换成十进制。

我讨厌甲骨文;所以每个人都想要一个普通的小数点,但是Oracle让我们跳出了困境。谢谢,我用这个作为我的解决方案。我第一次与Oracle提供商合作并不愉快……eschneider:在C#发明之前,Oracle拥有更高的精度,因此他们必须做一些事情,允许使用数据库提供的全部精度。这在非常大的数字上失败

decimal.TryParse(oraReader.GetOracleValue(0).ToString(), 
  NumberStyles.Any, null, out parsedOraDecimal)
decimal d = (decimal)(OracleDecimal.SetPrecision(oraReader.GetOracleDecimal(0), 28));
SELECT round( myfield, 18 ) FROM mytable