具有可更改的DateTime字段和Dapper更新的SqlDateTimeOverflow异常

Sim*_*mon 5 sql-server dapper

我有一个db表,其中包含几个具有空值的DateTime字段.这些映射到我的类中可为空的DateTimes.

如果我尝试使用Dapper在我的数据层中执行更新:

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

我得到一个SqlDateTimeOverflow异常(因为DateTime字段是'01/01/0001 00:00:00'而不是null.

唯一的方法是单独指定每个参数并将值切换为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... );
Run Code Online (Sandbox Code Playgroud)

我在表中有大约50个字段,所以这将是相当多的代码,另外还有一个INSERT方法也可以类似地更新.我错过了更简单的语法吗?

Mar*_*ell 5

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

重新更新语句-也许添加一个扩展方法以在最小值和null之间映射?

public static DateTime? NullIfZero(this DateTime when) {
    return when == DateTime.MinValue ? (DateTime?)null : when;
}
Run Code Online (Sandbox Code Playgroud)

并使用:

new { MyDateField = MyDateField.NullIfZero() }
Run Code Online (Sandbox Code Playgroud)

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

new { MyDateField }
Run Code Online (Sandbox Code Playgroud)