2013-12-17 61 views
0

與空處理我有這樣的讀者:在SqlDataReader的

using (SqlDataReader reader = command.ExecuteReader()) 
{ 
    while (reader.Read()) 
    { 
     var item = new Product 
     { 
      _x1 = reader.GetString(0), 
      _x2 = reader.GetString(1), 
      _x3 = reader.GetString(2), 
      _x4 = reader.GetDateTime(3) 
     }; 
     list.Add(item); 
    } 
} 

但有時候數據庫中有一些NULL的價值觀和我得到的數據是空的例外,我該怎麼處理呢?

+0

當空例外出現?無論如何,把一個'if(reader!= null'或者在一個'try/catch'裏面? – Tico

+0

你可以使x變量爲空嗎? –

+0

@Tico當我創建新的Product對象時,異常會被觸發 – gog

回答

2

最有可能的一個列值是DBNull。你不檢查。

在讀取可能具有空值的列時,我使用了一系列擴展方法。如果基類型不可爲空,則返回值是原始類型的可空變量。

public static string GetStringOrNull(this IDataReader reader, int ordinal) 
{ 
    return reader.IsDBNull(ordinal) ? null : reader.GetString(ordinal); 
} 


public static DateTime? GetDateTimeOrNull(this IDataReader reader, int ordinal) 
{ 
    return reader.IsDBNull(ordinal) ? null : (DateTime?)reader.GetDateTime(ordinal); 
} 
0

您在這裏遇到的根本問題是.NET在調用reader.GetString()時不能將「NULL」轉換爲字符串。爲了解決您的問題,您必須確定如果數據讀取器中的值爲NULL,並在編程代碼中提供此值,您需要執行的操作。你想使用空字符串嗎?你想使用null嗎?你想要例外嗎?

我會建議爲DataReader類編寫一個擴展方法來創建封裝所需邏輯的新函數。這是一個例子:

public static string GetStringOrEmptyString(this IDataReader reader, int ordinal) 
{ 
    if (reader.IsDBNull(ordinal)) { 
     // if its DBNULL, return empty string 
     return ""; 
    } else { 
     // otherwise return thew value as string 
     return reader.GetString(ordinal); 
    } 
} 

您可以使用此像這樣:

var item = new Product 
{ 
    _x1 = reader.GetStringOrEmptyString(0), 
    _x2 = reader.GetStringOrEmptyString(1), 
    _x3 = reader.GetStringOrEmptyString(2), 
    _x4 = reader.GetDateTime(3) 
};