5

我有一个 db 表,其中包含几个具有空值的 DateTime 字段。这些映射到我班级中的可为空的日期时间。

如果我尝试在我的数据层中使用 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。

解决此问题的唯一方法是单独指定每个参数并将值切换为 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

1 回答 1

6

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

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

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

并使用:

new { MyDateField = MyDateField.NullIfZero() }

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

new { MyDateField }
于 2013-05-09T12:17:03.307 回答