2011-08-09 22 views
6

我目前正在一個C#項目,將導出MySQL數據。導出用於服務器內的任何數據庫,所以我不知道表中的哪些字段和數據類型,我不知道表中的字段是否允許空值。MySQLDataReader檢索空值問題在C#

在測試過程中,我發現導出工作正常,但如果該字段允許null,當mysql數據讀取器進入空行時,它會顯示錯誤SqlNullValueException,數據爲空。

我試過做if (reader.getString(field) == null) {}但它仍然顯示錯誤。

如何處理數據庫中的空值。

感謝您提供的任何幫助。

回答

17

您需要的讀者如此明確地測試空:

if (!reader.IsDbNull(field)) { 
    var value = reader.GetString(field); 
    // ... do stuff here ... 
} 
+0

感謝您的幫助 – Boardy

+0

難道不該'.IsDbNull(閱讀器[ 「字段」])'?或者我錯了? – Hossein

+2

取決於閱讀器實現/幫助器方法。基本接口IDataReader只能使用整數列索引。然而,MySqlDataReader有重載需要一個字符串字段名稱,它只是一個reader.GetOrdinal查找。 – Nicholi

2

.NET沒有使用null字面來區分數據庫空。我只能推測,但我懷疑這是因爲許多常見的數據庫列類型(int,float等)都是值類型,並且將值類型與null進行比較根本無法滿足您的期望。

請改爲檢查DBNull.Value或使用.IsDbNull()函數。

1

我在使用允許空值的字段上使用GetString()方法時遇到了問題。我工作圍繞這個做類似:

reader[0].ToString()

3

在這個博客帖子有讀者一個很好的擴展方法

SQL Data Reader - handling Null column values

我改成了IDataReader的接口

public static string GetStringSafe(this IDataReader reader, int colIndex) 
    { 
     return GetStringSafe(reader, colIndex, string.Empty); 
    } 

    public static string GetStringSafe(this IDataReader reader, int colIndex, string defaultValue) 
    { 
     if (!reader.IsDBNull(colIndex)) 
      return reader.GetString(colIndex); 
     else 
      return defaultValue; 
    } 

    public static string GetStringSafe(this IDataReader reader, string indexName) 
    { 
     return GetStringSafe(reader, reader.GetOrdinal(indexName)); 
    } 

    public static string GetStringSafe(this IDataReader reader, string indexName, string defaultValue) 
    { 
     return GetStringSafe(reader, reader.GetOrdinal(indexName), defaultValue); 
    } 
+1

你是對的更好的擴展,而不是做同樣的事情所有的代碼 – MrAlex6204

1

您可以隨時使用c#條件運算符'?'像這樣......

string val = (reader.IsDBNull(columnIndex)) ? "" : reader.GetString(columnIndex);