我知道有几个主题和帖子就这个问题在网上和我读过他们(不是每一篇文章,我不得不承认),但他们没有也完全满足了我。

我的情况:点击 我使用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,000000000000000000000000000000000000000000000000000000000E-126


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

现在,我必须找到某种方式来适当地检索和评估这个价值 - DB也从超出我的控制的其他应用程序使用,因此有改变是不可能的。

这“十进制”到“双”在我的C#代码转换类型还算不上一个选项。

任何想法?

有帮助吗?

解决方案

我刚做了一个类似的问题,并试图改变OracleDataAdapter返回的Oracle特定类型的方法(data_adapter.ReturnProviderSpecificTypes = TRUE),但是这仅仅是一个皮塔饼,你最终铸造OracleStrings回字符串,等等。

在最后我解决它做使用Oracle的功能全面的精度在SQL语句中取整:

SELECT round( myfield, 18 ) FROM mytable

DOTNET然后将在图愉快地转换为十进制。

其他提示

OracleDecimal具有比小数更大精度。出于这个原因,你必须先降低精度。忘记所有的解析,使用隐式转换。尝试沿的(另)线的东西:

decimal d = (decimal)(OracleDecimal.SetPrecision(oraReader.GetOracleDecimal(0), 28));
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top