DBNull的简洁用法?(三元?)

bwe*_*rks 9 c# ado.net dbnull ternary-operator

似乎三元运算符中存在某种类型的混淆.我知道这已经在其他SO线程中得到了解决,但它始终是无效的.另外,对于我的情况,我真的只是在寻找更好的方法.

我希望能够使用

proc.Parameters[PARAM_ID].Value = 
    string.IsNullOrEmpty(dest.Id) ? DBNull.Value : dest.Id;
Run Code Online (Sandbox Code Playgroud)

但相反,我坚持这个:

if (string.IsNullOrEmpty(dest.Id))
{
    proc.Parameters[PARAM_ID].Value = DBNull.Value;
}
else
{
    proc.Parameters[PARAM_ID].Value = dest.Id;
} 
Run Code Online (Sandbox Code Playgroud)

三元运算符失败是因为DBNull和字符串之间没有可能的转换,并且看起来很傻,因为值似乎是对象,编译器将它踢回给我,我不得不关心.这个问题的可空版本的答案是将null转换为字符串并完成它; 但是DBNull不能转换成字符串,所以没有运气.

有没有更简洁的方法来做到这一点(顺便说一下,没有使用nullables?)

谢谢!

Jac*_*cob 21

您可以将您的第一个语句更改为:

proc.Parameters[PARAM_ID].Value = 
    string.IsNullOrEmpty(dest.Id) ? (object)DBNull.Value : dest.Id;
Run Code Online (Sandbox Code Playgroud)

  • 哦.咄.Aaand就是stackoverflow的用途.谢谢! (4认同)

Mar*_*ers 6

Value属性属于类型object,因此您应该转换为object,而不是string:

proc.Parameters[PARAM_ID].Value = string.IsNullOrEmpty(dest.Id)
    ? (object)DBNull.Value
    : (object)dest.Id;
Run Code Online (Sandbox Code Playgroud)


Kel*_*ams 6

或者您可以添加扩展方法,例如:

public static class DBNullExtensions
{
    public static object AsDBNullIfEmpty(this string value)
    {
        if (String.IsNullOrEmpty(value))
        {
            return DBNull.Value;
        }
        return value;
    }
}
Run Code Online (Sandbox Code Playgroud)

然后你可以说

proc.Parameters[PARAM_ID].Value = dest.Id.AsDBNullIfEmpty();
Run Code Online (Sandbox Code Playgroud)

(改编自Phil Haack)

可读和简洁,不是吗?

  • 坏消息!也许你可以用石头方尖碑凿出一些东西;) (3认同)