需要进行以下检查以检查空值。我有办法直接做到吗?
if(node.ID==0)
{
cmd.Parameters["@ID"].Value = DBNull.Value;
}
else
{
cmd.Parameters["@ID"].Value = node.ID;
}
我们可以通过这种检查和设计来避免对每个值进行重复检查吗? (顺便说一下,它只是一个逻辑,0对于我的情况被解释为NULL但是我也要求像字符串这样的可空对象一样)
答案 0 :(得分:5)
您可以使用?: Operator
cmd.Parameters["@ID"].Value = node.ID == 0 ? (object)DBNull.Value : node.ID;
答案 1 :(得分:4)
对于可空类型,我只使用扩展方法:
public static object CoalesceNullToDBNull(this object input)
{
return input == null ? DBNull.Value : input;
}
然后将其用作:
cmd.Parameters["Foo"].Value = someExpression.CoalesceNullToDBNull();
(当然,你可以给它一个更短的名字。)
但这对你的情况没有帮助,因为你试图将非null值合并为null。我个人会考虑重新设计你的模型 - 使用可空类型的值可以为null,而不是使用幻数。但是,您可以仍然使用通用扩展方法:
public static object CoalesceDefaultToDBNull<T>(this T input)
{
return EqualityComparer<T>.Default.Equals(input, default(T))
? DBNull.Value : (object) input;
}
这会将0
,'\0'
,false
,null
等转换为DBNull.Value
。你必须非常小心地使用它,因为我认为有很多地方0应该真的是0。
答案 2 :(得分:0)
如果您经常这样做,请尝试将检查放在方法内。
例如:
// ...
SetFormattedValue(ref cmd, node.ID);
// ...
private void SetFormattedValue(ref IDBCommand cmd, int id) // IDBCommand - or whatever your command type is
{
if(node.ID==0)
{
cmd.Parameters["@ID"].Value = DBNull.Value;
}
else
{
cmd.Parameters["@ID"].Value = node.ID;
}
}
答案 3 :(得分:0)
You can use the ??
operator:
cmd.Parameters["@ID"].Value = node.ID ?? (object)DBNull.Value