2013-05-09 44 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