IDataRecord.IsDBNull导致System.OverflowException(算术溢出)

时间:2010-03-30 12:39:07

标签: c# .net odbc db2

我有一个OdbcDataReader,它从数据库中获取数据并返回一组记录。

执行查询的代码如下所示:

OdbcDataReader reader = command.ExecuteReader();

while (reader.Read())
{
    yield return reader.AsMovexProduct();
}

该方法返回自定义类型(MovexProduct)的IEnumerable。从IDataRecord到我的自定义类型MovexProduct的转换发生在一个看起来像这样的扩展方法(缩写):

public static MovexProduct AsMovexProduct(this IDataRecord record)
{
    var movexProduct = new MovexProduct
    {
            ItemNumber = record.GetString(0).Trim(),
            Name = record.GetString(1).Trim(),
            Category = record.GetString(2).Trim(),
            ItemType = record.GetString(3).Trim()
    };

    if (!record.IsDBNull(4)) 
        movexProduct.Status1 = int.Parse(record.GetString(4).Trim());

    // Additional properties with IsDBNull checks follow here.

    return movexProduct;
}

当我点击if (!record.IsDBNull(4))时,我收到一个OverflowException,异常消息“算术运算导致溢出。”

堆栈跟踪: System.OverflowException was unhandled by user code Message=Arithmetic operation resulted in an overflow. Source=System.Data StackTrace: at System.Data.Odbc.OdbcDataReader.GetSqlType(Int32 i) at System.Data.Odbc.OdbcDataReader.GetValue(Int32 i) at System.Data.Odbc.OdbcDataReader.IsDBNull(Int32 i) at JulaAil.DataService.Movex.Data.ExtensionMethods.AsMovexProduct(IDataRecord record) [...]

我之前从未遇到过这个问题,我无法弄清楚为什么会得到它。我已经验证记录存在并且它包含数据并且我提供的索引是正确的。我还应该提一下,如果我将if-statemnt更改为:if (record.GetString(4) != null),我会得到相同的异常。什么工作将属性赋值封装在try {} catch (NullReferenceException) {}块中 - 但这可能导致性能损失(不是吗?)。

我正在运行Visual Studio的x64版本,而且我使用的是64位odbc驱动程序。

还有其他人遇到过这个吗?关于如何解决/解决这个问题的任何建议?

非常感谢!

2 个答案:

答案 0 :(得分:0)

对于遇到相同问题的任何人,我解决这个问题的方法是从Odbc *类切换到他们的OleDb *对应物。这当然要求您的数据驱动程序支持OleDb连接。

答案 1 :(得分:0)

您想与哪个数据库交谈?如果它使用一些可能导致问题的“私有”列类型。当然,这不适用于SQL Server: - )

同时检查您是否正在编译并以x64格式运行(Process Explorer将向您展示,甚至简单的大头钉管理器也会显示它)。 devenv.exe仍然是x86但你的实际二进制文件应该以x64运行。我提到的原因是,跨越32/64位边界因打破第三方ODBC驱动程序而臭名昭着。