我有以下代码来设置一个参数,该参数将在INSERT语句中用于在SQL Server数据库中设置VARCHAR列。我的值对象(名为ilo)有一个名为Description的属性,它被初始化为String.Empty,然后被设置为从XML读取的某个值,或者如果该XML元素为空,它只保留为String.Empty。
因此,当插入数据库时,如果该属性仍设置为String.Empty,我想让它插入一个空值。
database.AddInParameter(cmd, "@description", DbType.String,
(ilo.Description.Equals(string.Empty)) ?
DBNull.Value :
ilo.Description);
所以基本上我说,如果ilo.Description等于string.empty,请将参数设置为DBNull.Value,否则将其设置为ilo.Description。
这在Visual Studio中出现以下错误...
错误141无法确定条件表达式的类型,因为'System.DBNull'和'string'之间没有隐式转换
为什么?
奇怪的是,我可以在没有错误的情况下执行以下操作,这应该与使用上面的内联条件语法完全相同!?!
if(ilo.Description.Equals(string.Empty))
{
database.AddInParameter(cmd, "@description", DbType.String, DBNull.Value);
}
else
{
database.AddInParameter(cmd, "@description", DbType.String, ilo.Description);
}
我搜索了其他帖子,找到了下面的帖子,但它并没有真正回答我的问题。
EntLib Way to Bind "Null" Value to Parameter
我对WHY更感兴趣,因为明显的解决方法是使用if / else语句而不是内联(三元)语法?
在这个链接上有一个答案,但我想要一个更好的解释,因为它似乎是我的BS,这不起作用;我称之为虫子!
答案 0 :(得分:41)
这是人们在使用条件运算符时收到的常见错误。要修复它,只需将一个或两个结果转换为公共基类型。
ilo.Description.Equals(string.Empty)
? (object)DBNull.Value
: ilo.Description
您看到的错误消息中显示了该问题。
无法确定条件表达式的类型,因为'System.DBNull'和'string'之间没有隐式转换
字符串不是DBNull,DBNull不是字符串。因此,编译器无法确定表达式的类型。通过使用强制转换为公共基类型(在本例中为object
),您可以创建一个场景,然后编译器可以确定该字符串也可以转换为对象,因此表达式的类型可以确定为对象,它也非常适合您的代码行也期望作为DbParameter参数。
答案 1 :(得分:4)
这是我在另一个帖子中找到的,它对我很有用:
yourVariable ?? (object)DBNull.Value
我希望它有所帮助。
答案 2 :(得分:2)
安东尼确实是对的,所以他应该得到正确的答案,但这是一种延伸方法,因为我很无聊......
public static object NullCheck(this string self)
{
return (string.IsNullOrEmpty(self)) ? (object)DBNull.Value : self;
}
在您的方案中使用:
database.AddInParameter(cmd, "@description", DbType.String,
ilo.Description.NullCheck());
答案 3 :(得分:1)
您收到编译错误,因为三元表达式的两个部分必须属于同一类型。对于这种特殊情况,最简单的解决方法是将两者都转换为对象:
database.AddInParameter(cmd, "@description", DbType.String,
(ilo.Description.Equals(string.Empty)) ?
(object) DBNull.Value :
(object) ilo.Description);