2012-04-10 70 views
2

下面是一些代碼:無法從數據庫中獲取列類型

OdbcConnection connection = new OdbcConnection(@"DRIVER={MySQL ODBC 5.1 Driver};SERVER=" + ip + ";DATABASE=db_name;USER=user;PASSWORD=" + dbPw + ";"); 
connection.Open(); 

string queryString = query; 
OdbcCommand command = new OdbcCommand(queryString); 

command.Connection = connection; 
OdbcDataReader myReader = command.ExecuteReader(); 
int fieldsN = myReader.FieldCount; 

StringBuilder sb = new StringBuilder(); 

while (myReader.Read()) 
{ 
    for (int i = 0; i < fieldsN; i++) 
    { 
     sb.Append(myReader.GetString(i) + " "); 
    } 
    sb.Append(", "); 
} 

connection.Close(); 

//Console.WriteLine(sb.ToString()); 

此代碼工作正常查詢,如 「SELECT * FROM some_table」 或 「SELECT(的東西,something_else)FROM some_table。」

但是,當我使用「SHOW COLUMNS FROM some_table」時它失敗。

這是我得到的錯誤:

無法投類型的對象'System.DBNull爲鍵入「System.String」。

此錯誤發生在myReader.GetString()行的某處。

我試着創建一個if語句,檢查如果myReader.GetString(i)是System.DBNull無濟於事。無論我做什麼,總會犯錯。我不明白髮生了什麼事。

感謝您的幫助!

回答

2

在調用GetString()之前,您需要檢查DBNull。 See this answer.

if (!myReader.IsDBNull(i)) 
    sb.Append(myReader.GetString(i)); 
+0

正是我需要的,謝謝。 – 2012-04-10 03:27:27

1

通常,您需要關注可空列的值。 DB通過返回一個稱爲DBNull的特殊對象來指示返回值爲null。你不能將它轉換爲string或其他任何東西,所以你的代碼應該使用IsDBNull這樣的檢查空:

if (!myReader.IsDBNull(i)) { 
    sb.Append(myReader.GetString(i) + " "); 
} 
+0

謝謝,這正是我需要的。 mgnoonan擊敗你,雖然:) – 2012-04-10 03:27:18