2010-08-06 81 views
7

我已定义类属性生日可为空DateTime?,那么为什么不应该在以下示例中使用空合并运算符?C#?空合并运算符问题

cmd.Parameters.Add(new SqlParameter("@Birthday", 
    SqlDbType.SmallDateTime)).Value =  
    person.Birthday ?? DBNull.Value; 

我得到的编译器错误是“Operator'??'不能应用于'System.DateTime'类型的操作数和“System.DBNull””

下也得到了一个编译错误:所推荐的重构,它编译,但是没有正常工作

cmd.Parameters.Add(new SqlParameter("@Birthday", 
    SqlDbType.SmallDateTime)).Value = 
    (person.Birthday == null) ? person.Birthday:DBNull.Value; 

我添加了一个投地(对象)在两种情况下,该值都存储在sqlserver数据库中为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; 
+3

重复http://stackoverflow.com/questions/218808/c-ado-net-nulls-and-dbnull-is-there-more-efficient-syntax – sgriffinusa 2010-08-06 15:25:17

+0

从其他帖子得到了这个:SqlDbType.SmallDateTime) ).Value = person.Birthday ?? (对象)DBNull.Value;谢谢! – 2010-08-06 16:18:38

回答

20

的问题是,DateTime?DBNull.Value是不是同一类型的,所以你不能使用空合并运算符他们。

在你的情况,你可以做person.Birthday ?? (object)DBNull.Value通过对Add()

3

你的第一个问题是,对于???:运营商,无论是对于选择的对象必须是同一类型传递object类型的值。在这里他们是不同的类型。

+1

那么'':'做什么?编辑:没关系,我知道,从来没有看到过这样的2个符号放在一起。 http://msdn.microsoft.com/en-us/library/ty67wk28.aspx – 2010-08-06 15:55:05

3

我宁愿遍历我的参数只是执行查询,改变空的所有实例的DBNull适当之前,例如:

foreach (IDataParameter param in cmd.Parameters) 
    if (param.Value == null) 
     param.Value = DBNull.Value; 

这让我离开的空值原样,只是交换他们以后再集体。

+0

对我来说,这是干净,简单,很好的答案。 – 2012-05-15 19:06:17

+0

我的问题是在事实之后迭代参数的额外开销,而不是立即处理它们。 – Andrew 2017-03-24 17:25:03