OracleDataReader InvalidCastException:.NET中的十进制类型上的“指定的转换无效”

时间:2019-06-19 19:20:48

标签: .net oracle-manageddataaccess

在使用Oracle.ManagedDataAccess.Client.OracleDataReader然后调用reader.GetValue(i)时,上面出现了异常。

这可以使用以下查询进行模拟:

SELECT 1/3 as foo FROM DUAL

当oracle数据为Oracle类型Decimal时,会出现问题,并且数据的精度超过.NET十进制中的小数位数。而且主要的问题是reader.GetValue(i)会执行此操作,因此您无法控制它会在内部引发此错误的事实。

我实际上有一个变通办法,因为我过去已经多次遇到此问题,所以我将其发布为答案,并且网络还没有一个好的答案。

相关:

https://community.oracle.com/thread/4017980

"Specified cast is not valid" when populating DataTable from OracleDataAdapter.Fill()

1 个答案:

答案 0 :(得分:0)

很抱歉花了这么长时间才发布@Jeff!解决办法是获取字段类型,如果是十进制,则调用oracle显式方法GetOracleDecimal()

if (reader.GetFieldType(i).Name.ToUpper() == "DECIMAL")
{
    var x = reader as Oracle.ManagedDataAccess.Client.OracleDataReader;
    var dec = x.GetOracleDecimal(i);
    value = dec.ToString();
}

宇宙中的所有其他字段都可以与 reader.GetValue() 一起使用 这就是 Oracle 的特别之处:)