2013-02-14 60 views
1

我正在從一個應用程序讀取OLESQL服務器中的數據。目前我只是讀取數據並將其插入到字符串中。每當我遇到一個DBTYPE_WVARCHAR時,我都會做一些閱讀。我可以使用myReader.GetString(index),但是當這種情況發生時我會崩潰。這是我迄今爲止的代碼。解析OLEDB var類型C#

OleDbDataReader myReader = myCommand.ExecuteReader(); 

while (myReader.Read()) 
{ 
    int i =0; 
    string FullRow = ""; 
    for(i=0;i<myReader.FieldCount;i++) 
    { 
     string type=myReader.GetDataTypeName(i); 

     if ("DBTYPE_I4" == type) 
     { 
       FullRow += myReader.GetInt32(i); 
     } 
     else if ("Date" == type || "DBDate" == type || "DBTimeStamp" == type) 
     { 
       FullRow += myReader.GetDateTime(i).ToString(); 
     } 
     else if("Char" == type || "LongVarChar" == type || "LongVarWChar" == type || "VarWChar" == type || "WChar" == type){ 
       FullRow += myReader.GetString(i); 
      } 
     else if ("DBTYPE_WVARCHAR" == type) 
      { 
      FullRow += myReader.GetString(i); //Crash when this line gets hit 
      } 
      else 
      { 
       FullRow=FullRow; 
      } 
    } 
    FullRow+=", "; 
    Console.Write(FullRow); 
} 
+1

「我正在崩潰」 - 大概有一個例外?什麼是例外? – 2013-02-14 15:49:31

+0

我可能是錯的,但有一點告訴我WVARCHAR更多的是一個多字節的UniCode字符,而不是簡單的A-Z字符。 – DRapp 2013-02-14 15:54:36

+0

@JonSkeet我得到一個InvalidCastException 而對於DrApp Googlefu告訴我的WVARCHAR是很好的通過.GetString()我沒有看到任何.GetUnicodeString():/也使用 使用System.Data.OleDb; – 2013-02-14 16:05:03

回答

2

因爲有examples使用GetString這是一個奇怪的問題,但是一個替代方案是:

FullRow += myReader.IsDBNull(i) ? null : myReader.GetValue(i).ToString(); 
+0

再一次,謝謝@D Stanley,它看起來NULL的字段值確實會擾亂解析系統。我只會使用isDBNull的一切。 – 2013-02-14 16:23:45

+0

在你的情況下,你並不需要檢查源類型,因爲你將所有東西都轉換爲字符串...... – 2013-02-14 16:26:10