【问题标题】:OracleDataReader InvalidCastException: "Specified cast is not valid" on Decimal Types in .NETOracleDataReader InvalidCastException:.NET 中的十进制类型上的“指定强制转换无效”
【发布时间】:2019-11-02 14:21:30
【问题描述】:

当使用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()

【问题讨论】:

  • SELECT 1/3 as foo FROM DUAL 不会导致0? (也许 Oracle 会自动转换为小数或浮点数?)
  • 您不能使用其他方法...例如 reader.GetDecimal() 或类似的方法吗?
  • @douglas.kirschman,不幸的是,GetDecimal 也失败了。
  • @Igor,Oracle 确实正确地转换了这些,所以你得到 0.33333...
  • @DanielWilliams 我自己刚遇到这个问题。您在问题中提到您会发布解决方法作为答案,但从未这样做。

标签: .net oracle-manageddataaccess


【解决方案1】:

很抱歉,@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 的特别之处 :)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-01-12
    • 1970-01-01
    • 1970-01-01
    • 2015-08-21
    • 2020-11-16
    • 1970-01-01
    • 2018-05-27
    • 2014-07-30
    相关资源
    最近更新 更多