2010-03-30 63 views
1

我有一个OdbcDataReader从数据库获取数据并返回一组记录。IDataRecord.IsDBNull导致System.OverflowException(算术溢出)

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

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驱动程序。

有没有人遇到过这个?关于如何解决/解决此问题的任何建议?

非常感谢!

+0

的是在正处于第4索引获取列的SQL数据类型? – HotTester 2010-03-30 12:44:48

+0

这是一个GRAPHIC()CCSID 13488(2),无论是(?)。 – Ciddan 2010-03-30 13:23:34

回答

0

对于任何一个遇到同样的问题,我解决这个问题的方法是从ODBC *类切换到它们的OleDb *同行。这当然要求您的数据驱动程序支持OleDb连接。

0

哪个DB你想说话?如果它使用可能导致问题的某些“专用”列类型。这并不适用于过程的SQL服务器:-)

也检查你的编译和运行的x64(Process Explorer中会告诉你thsi,甚至普通的粘性管理器显示它)。 devenv.exe仍然是x86,但您的实际二进制文件应该以x64运行。我提到的原因是跨越32/64位边界对于破坏第三方ODBC驱动程序而言是臭名昭着的。

相关问题