我有以下C#代码:
sqlCommand.Parameters.AddWithValue("@Parameter", table.Value ?? DBNull.Value);
但它会引发以下编译错误:
运营商
??
无法应用于string
和System.DBNull
类型的操作数
为什么编译器不允许这种语法?
答案 0 :(得分:34)
两个操作数都需要是对象。使用显式强制转换:
(object)table.Value ?? DBNull.Value;
答案 1 :(得分:16)
string
和System.DBNull
之间没有自动转换,因此您需要通过向object
添加强制转换来明确指定您想要的类型:
sqlCommandObject.Parameters.AddWithValue("@Parameter",
table.Value ?? (object)DBNull.Value);
答案 2 :(得分:7)
这是因为string
和System.DBNull
之间没有隐式转换。
答案 3 :(得分:6)
可以使用Convert.DBNull代替使用DBNull.Value:
sqlCommand.Parameters.AddWithValue("@Parameter", table.Value ?? Convert.DBNull);
我相信,在幕后它基本上是在做其他示例中提到的相同/相似的事情(即,将DBNull强制转换为对象),但是这使其更简单/更容易。
答案 4 :(得分:0)
另一种解决方法是利用SqlString.Null
。
例如:command.Parameters.Add(new SqlParameter("@parameter", parameter ?? SqlString.Null));
每种类型都有其自己的版本。 SqlGuid.Null
,SqlDateTime.Null
等