我已经定义的类的属性的生日作为<强>可为空的DateTime?下,为什么不应该空合并运算符在下面的例子中的工作?

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

编译器ERR我是“运算符‘?’不能适用于类型的操作数“的System.DateTime?和 'System.DBNull'”

也下面得到了一个编译错误:

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

我添加了一个浇铸到(对象)所推荐的重构,并且它编译,但没有正常工作并将该值存储在SQLSERVER分贝如在这两种情况下空。

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;
有帮助吗?

解决方案

的问题是,DateTime?DBNull.Value是不一样的类型,所以你不能使用空它们的聚结操作。

在你的情况可以执行person.Birthday ?? (object)DBNull.Value通过到object传递类型Add()的值

其他提示

我更喜欢遍历我的参数只是执行查询,改变空的所有实例的DBNull酌情,例如之前:

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

这让我离开的空值原样,只是换出来集体更高版本。

您第一个问题是,对于???:操作者,为任一选择的对象必须是相同的类型。这里它们是不同的类型。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top