我已将Class Person 属性生日定义为可以为null的DateTime?,那么为什么空融合运算符不能在以下示例中工作?
cmd.Parameters.Add(new SqlParameter("@Birthday",
SqlDbType.SmallDateTime)).Value =
person.Birthday ?? DBNull.Value;
我得到的编译器错误是“操作员'??'不能应用于'System.DateTime?'类型的操作数和'System.DBNull'“
以下也出现了编译错误:
cmd.Parameters.Add(new SqlParameter("@Birthday",
SqlDbType.SmallDateTime)).Value =
(person.Birthday == null) ? person.Birthday:DBNull.Value;
我按照Refactor的建议添加了一个转换为(对象),并且它已编译,但无法正常工作,并且在两种情况下,值都存储在sqlserver db中为null。
SqlDbType.SmallDateTime)).Value =
person.Birthday ?? (object)DBNull.Value;
有人可以解释这里发生了什么吗?
我需要使用以下笨拙的代码:
if (person.Birthday == null)
cmd.Parameters.Add("@Birthday", SqlDbType.SmallDateTime).Value
= DBNull.Value;
else cmd.Parameters.Add("@Birthday", SqlDbType.SmallDateTime).Value =
person.Birthday;
答案 0 :(得分:21)
问题是DateTime?
和DBNull.Value
的类型不同,因此您无法在其上使用空合并运算符。
在您的情况下,您可以person.Birthday ?? (object)DBNull.Value
将值object
的值传递到Add()
答案 1 :(得分:3)
您的第一个问题是,对于??
或?:
运算符,任一选择的对象必须是相同的类型。在这里他们是不同的类型。
答案 2 :(得分:3)
我更喜欢在执行查询之前迭代我的参数,根据需要将所有null实例更改为DBNull,例如:
foreach (IDataParameter param in cmd.Parameters)
if (param.Value == null)
param.Value = DBNull.Value;
这允许我按原样保留空值,然后简单地将它们整齐地交换出来。