2017-05-19 61 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

相关问题