【问题标题】:Concise usage of DBNull? (Ternary?)DBNull 的简洁用法? (三元?)
【发布时间】:2011-03-27 13:34:22
【问题描述】:

三元运算符似乎存在一些类型混淆。我知道这已在其他 SO 线程中得到解决,但它始终与可空值有关。另外,就我而言,我真的只是在寻找更好的方法。

我希望能够使用

proc.Parameters[PARAM_ID].Value = 
    string.IsNullOrEmpty(dest.Id) ? DBNull.Value : dest.Id;

但相反,我坚持这样做:

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

三元运算符失败是因为 DBNull 和字符串之间不可能进行转换,而且考虑到 Value 是对象,这似乎很愚蠢,编译器将它踢回给我,我不得不关心。这个问题的可空版本的答案是将 null 转换为字符串并完成它;但是,DBNull 不能转换为字符串,所以没有运气。

有没有更简洁的方法来做到这一点(顺便说一句,不使用可空值?)

谢谢!

【问题讨论】:

    标签: c# ado.net ternary-operator dbnull


    【解决方案1】:

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

    proc.Parameters[PARAM_ID].Value = 
        string.IsNullOrEmpty(dest.Id) ? (object)DBNull.Value : dest.Id;
    

    【讨论】:

    • 哦。呃。 Aaand 这就是 stackoverflow 的用途。谢谢!
    【解决方案2】:

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

    proc.Parameters[PARAM_ID].Value = string.IsNullOrEmpty(dest.Id)
        ? (object)DBNull.Value
        : (object)dest.Id;
    

    【讨论】:

    • 我要给雅各布答案,因为他显然先回答了大约 20 秒。谢谢你也马克!
    【解决方案3】:

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

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

    然后你可以说

    proc.Parameters[PARAM_ID].Value = dest.Id.AsDBNullIfEmpty();
    

    (改编自Phil Haack

    可读且简洁,不是吗?

    【讨论】:

    • 我挖掘扩展方法的使用;遗憾的是,这个项目是在 C#2.0 上的。嘘声。
    • 无赖!也许你可以用石方尖碑凿出一些东西;)
    【解决方案4】:

    使用 ??空合并运算符More details about ?? operator

    proc.Parameters[PARAM_ID].Value = dest.Id ?? (object)DBNull.Value;
    

    【讨论】:

    • 运算符'??'不能应用于“bool”和“object”类型。如果你删除 '(object)',编译器会抱怨 'DBNull' 类型而不是 'object'。
    • @ivorykoder ??运算符只能用于可空类型,因为lhs ?? rhs 本质上等同于lhs != null ? lhs : rhs。这就是为什么你得到“不能应用于'bool'类型” - bool 不可为空!
    • @ivorykoder 如果你想将 null 传递给数据库,它应该是一个可为空的值。这 ??运算符 con 仅用于可空类型。有道理,对吧?
    猜你喜欢
    • 2012-07-20
    • 2013-02-25
    • 2011-06-17
    • 2010-12-14
    • 1970-01-01
    • 2013-10-25
    • 2020-09-24
    • 1970-01-01
    相关资源
    最近更新 更多