C#ADO.NET:NULL和DbNull-是否有更高效的语法?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (99)

我有一个DateTime?,我试图插入到一个领域使用一个DbParameter。我创建这样的参数:

DbParameter datePrm = updateStmt.CreateParameter();
datePrm.ParameterName = "@change_date";

然后,我想提出的值DateTime?dataPrm.Value,而占null秒。

我以为我会很聪明:

datePrm.Value = nullableDate ?? DBNull.Value;

但错误会导致失败

Operator '??' cannot be applied to operands of type 'System.DateTime?' and 'System.DBNull'

所以我猜想,只有第二个参数是第一个参数的非空值版本才有效。那么我去了:

datePrm.Value = nullableDate.HasValue ? nullableDate.Value : DBNull.Value;

但是这也不起作用:

Type of conditional expression cannot be determined because there is no implicit conversion between 'System.DateTime' and 'System.DBNull'

但我不想在这些类型之间进行转换!

到目前为止,我唯一能够工作的是:

if (nullableDate.HasValue)
  datePrm.Value = nullableDate.Value;
else
  datePrm.Value = DBNull.Value;

这真的是我写这个的唯一方法吗?有没有办法使用三元运算符来实现单线程工作?

我真的不明白为什么?版本不起作用。MSDN说:

?? ?? 如果操作数不为null,则返回左侧操作数,否则返回右侧操作数。

这正是我想要的!

最后它显而易见:

datePrm.Value = nullableDate ?? (object)DBNull.Value;
提问于
用户回答回答于

datePrm.Value = nullableDate ?? (object)DBNull.Value;
用户回答回答于

如果使用的是C#3.0,可以创建一个扩展方法来轻松地做到这一点:

public static class DBNullableExtensions
{
    public static object ToDBValue<T>(this Nullable<T> value) where T:struct
    { 
        return value.HasValue ? (object)value.Value : DBNull.Value;
    }
}


class Program
{
    static void Main(string[] args)
    {
        int? x = null;

        Console.WriteLine(  x.ToDBValue() == DBNull.Value );
    }
}

扫码关注云+社区