2010-03-30 64 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驅動程序而言是臭名昭着的。

相關問題