2010-03-30 5 views
1

У меня есть OdbcDataReader, который получает данные из базы данных и возвращает набор записей.IDataRecord.IsDBNull вызывает System.OverflowException (арифметическое переполнение)

Код, который выполняет запрос выглядит следующим образом:

OdbcDataReader reader = command.ExecuteReader(); 

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

Метод возвращает IEnumerable из пользовательского типа (MovexProduct). Convertion из 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 с сообщением исключения «арифметическая операция привело к переполнению ».

StackTrace: 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) {}, но это может привести к потере производительности (не так ли?).

Я запускаю x64 версию Visual Studio, и я использую 64-разрядный драйвер odbc.

Есть ли у кого-нибудь еще такое? Любые предложения относительно того, как я могу решить эту проблему?

Большое спасибо!

+0

Каков тип данных в sql столбца, который извлекается в 4-м индексе? – HotTester

+0

Это GRAPHIC() CCSID 13488 (2), что бы это ни было (?). – Ciddan

ответ

0

Для любого, кто испытывает ту же проблему, я решил это переключиться с классов Odbc * на их аналоги OleDb *. Это, конечно, требует, чтобы ваш драйвер данных поддерживал соединения OleDb.

0

С какой БД вы пытаетесь поговорить? Если он использует некоторые «частные» типы столбцов, которые могут вызвать проблемы. Это, конечно же, не относится к SQL Server :-)

Также проверьте, что вы компилируетесь и работаете как x64 (Process Explorer покажет вам, что thsi и даже простой менеджер закладок показывает это). devenv.exe по-прежнему будет x86, но ваш фактический двоичный файл должен работать как x64. Причина, по которой я упоминаю, заключается в том, что пересечение границы 32/64 бит печально известно для взлома сторонних драйверов ODBC.

Смежные вопросы