【问题标题】:Read large number with oracle odbc用 oracle odbc 读取大数
【发布时间】:2015-01-31 01:15:27
【问题描述】:

我有一个包含NUMBER(38,0) 类型列的 Oracle 表

我需要将此列提取到我的 C# 应用程序。

我使用库 System.Data.Odbc.OdbcDataReader 从我的 Oracle 表中读取数据。

我尝试过使用以下普通函数获取数据:

var data = oracleReader["COLUMN"].ToString();

var data = oracleReader.GetString(0);

甚至是oracleReader.GetBytes() 函数。

但我总是得到System.OverflowException,因为OdbcDataReader 在最后一步总是尝试将列作为decimal

System.OverflowException: Value was either too large or too small for a Decimal.
   at System.Data.Odbc.OdbcDataReader.internalGetDecimal(Int32 i)
   at System.Data.Odbc.OdbcDataReader.GetValue(Int32 i, TypeMap typemap)
   at System.Data.Odbc.OdbcDataReader.GetValue(Int32 i)
   at System.Data.Odbc.DbCache.AccessIndex(Int32 i)
   at System.Data.Odbc.OdbcDataReader.internalGetString(Int32 i)
   at System.Data.Odbc.OdbcDataReader.GetString(Int32 i)

如果我能将此数据作为String 发送到我的应用程序,我会很高兴。

仅供参考,我无法更改列的数据类型,我需要使用它。

【问题讨论】:

    标签: c# oracle odbc


    【解决方案1】:

    此数据类型是 NUMBER(38) 数据类型的别名,旨在使 OracleDataReader 返回 System.Decimal 或 OracleNumber 而不是整数值。使用 .NET Framework 数据类型可能会导致溢出。

    想想看,您实际上需要 BigInteger 才能表示与 NUMBER 默认值相同的有效数字位数。我从未见过有人这样做,我想这是一个非常罕见的需求。此外,BigInteger 仍然不会削减它,因为 NUMBER 可以是正无穷大和负无穷大。

    您可以使用this list 进行未来研究。

    【讨论】:

    • 是否有绕过 .NET 表示的方法?我只需要以任何格式将数据输入我的应用程序。我的问题不是当我最终拥有数据时如何表示数据。
    • 如果你尝试:object data = oracleReader["COLUMN"],它会抛出异常吗?
    • 不看代码很难帮你。告诉我你想要获得的价值。我猜你必须通过 .NET 类型。尝试以下方法:GetDouble() 和 GetDecimal()。
    猜你喜欢
    • 2015-03-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-05
    • 2015-03-04
    相关资源
    最近更新 更多