我有一个db表,其中包含几个具有空值的DateTime字段。这些映射到我班级中可以为空的DateTimes。
如果我尝试使用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方法也可以类似地更新。我错过了更简单的语法吗?
答案 0 :(得分:4)
这里的问题是01/01/0001 00:00:00
不是“空值”;如果您使用过DateTime?
我怀疑它会运行正常。但是,我还必须认识到DateTime.MinValue
经常使用(主要是因为.NET 1.1缺少可空结构)来表示一个空值。我在这里的首选建议是简单地使用DateTime?
。最小值映射有点复杂,因为我们也可以考虑是否应该自动映射到sql min-value(1753年1月1日)。
重新更新语句 - 可能添加一个扩展方法来映射min-value和null?
public static DateTime? NullIfZero(this DateTime when) {
return when == DateTime.MinValue ? (DateTime?)null : when;
}
并使用:
new { MyDateField = MyDateField.NullIfZero() }
但是,如果MyDateField
为DateTime?
,您可以使用:
new { MyDateField }