2017-05-19 62 views
0

我想取記錄到listarray如下:爲什麼在這種情況下空合併操作符不工作?

List<Car> lst = new List<Car>(); 

string str = "select * from Inventory"; 

using(SqlCommand cmd = new SqlCommand(str,this.sqlcon)) 
{ 
    SqlDataReader rdr = cmd.ExecuteReader(); 

    while (rdr.Read()) 
    { 
     lst.Add(new Car 
        { 
         CarId = (int)rdr["CarId"], 
         Make = (string)(rdr["Make"] ?? ""), 
         Color= (string)(rdr["Color"] ?? ""), 
         PetName = (string)(rdr["PetName"] ?? "") 

        }); 
    } 

    rdr.Close(); 
} 

製作,顏色和petname可能有NULL值,因此我用了??操作。我收到以下錯誤

無法將system.dbnull類型的對象轉換爲「system.string」。

什麼是在這種情況下檢查null的正確方法?

+0

@代碼一個好的答案並不意味着它不能被關閉。 –

回答

8

DBNullnull不一樣,所以不能使用??運算符。你必須分開處理這個案子。

替換:

Make = (string)(rdr["Make"] ?? ""), 

與:

Make = (rdr["Make"] == System.DBNull.Value ? "" : (string)rdr["Make"]), 
+0

System.DBNull引發編譯錯誤。改用dbnull.value,它工作正常。 TX! – Poongodi

+0

@Poongodi謝謝你,我已經更新了答案 – fubo

1

SqlDataReader返回的DBNull對象,這是不是C#空 - 它是表示在數據庫中的NULL值的對象。

你有多種選擇,並創建一個方法來處理,可能是最可讀的,並節省您的重複代碼:

private static string GetStringOrEmpty(object dbValue){ 
    return dbValue == System.DBNull.Value ? string.Empty : (string)dbValue; 
} 

然後

Make = GetStringOrEmpty(rdr["Make"]), 

或者看看Dapper這是一個非常小但功能強大的ORM,可以爲你處理大量的這些東西。

+0

System.DBNull拋出編譯錯誤。改用dbnull.value,它工作正常。 TX! – Poongodi

相關問題