-
19-09-2019 - |
题
我知道有几个主题和帖子就这个问题在网上和我读过他们(不是每一篇文章,我不得不承认),但他们没有也完全满足了我。
我的情况:点击 我使用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));
不隶属于 StackOverflow