2013-05-09 143 views
4

我有一个数据库表与多个日期时间字段与空值。这些映射到我的类中的可为空的DateTimes。SqlDateTimeOverflow异常与可空的日期时间字段与Dapper更新

如果我尝试执行与短小精悍的更新,我的数据层中:

using (IDbConnection cnn = new SqlConnection(DB.getConString())) 
{ 
    cnn.Open(); 
    return cnn.Execute((this.OptionID == 0 ? _insertSQL : _updateSQL), this);    
} 

我得到一个SqlDateTimeOverflow例外(因为DateTime字段是'01/01/0001 00:00:00' ,而,比空

是解决这个问题的唯一方法分别指定每个参数和切换值设置为null这样的:

using (IDbConnection cnn = new SqlConnection(DB.getConString())) 
{ 
    cnn.Open(); 
    return cnn.Execute("UPDATE MyTable SET MyDateField = @MyDateField", new {MyDateField = (MyDateField.HasValue? MyDateField : Null), etc etc...); 

我有表所以这将约50场是相当多的代码,再加上有一个INSERT方法也可以进行类似的更新。有没有更简单的语法,我失踪了?

回答

4

这里的问题是01/01/0001 00:00:00而不是一个“空值”;如果你曾使用DateTime?我怀疑它会工作得很好。但是,我也必须认识到,DateTime.MinValue经常(主要是由于.NET 1.1缺少可空结构)已被用于表示为空值。我的首选建议是简单地使用DateTime?。最小值映射有点复杂,因为我们也可能会考虑是否应该自动映射到sql最小值(1753年1月1日)。

重新更新语句 - 也许增加一个扩展方法来映射最小值和空值?

public static DateTime? NullIfZero(this DateTime when) { 
    return when == DateTime.MinValue ? (DateTime?)null : when; 
} 

及用途:

new { MyDateField = MyDateField.NullIfZero() } 

但同样,如果MyDateFieldDateTime?,你可以只使用:

new { MyDateField } 
+0

是,楼市已经是日期时间?但它不会最终为空。例如:public DateTime? ReleaseDate {get;组; }。 – Simon 2013-05-09 12:53:43

+0

@Simon是的,但**值**是什么?具有值“01/01/0001 00:00:00”的“DateTime?”不为空*;如果你希望它是'null' - 将它作为'null'存储。 – 2013-05-09 13:00:18

+0

如果这就是你的意思,那么数据库中的值为空? – Simon 2013-05-09 13:03:27