You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用DateOnly.MinValue插入SQL Server时遇NotSupportedException问题求助

解决DateOnly作为SQL Server参数抛出NotSupportedException的问题

问题核心原因

  1. 你使用的ORM工具(从代码看是Dapper)版本较旧,未内置支持.NET 6+引入的DateOnly值类型,无法自动将其映射为SQL Server的Date类型参数。
  2. 额外隐患:DateOnly.MinValue(0001-01-01)超出了SQL Server Date类型的合法取值范围(SQL Server Date类型最小值为1753-01-01),即使解决了类型映射问题,直接插入该值也会触发新的异常。

可行解决方案

方案1:升级Dapper到最新稳定版

直接通过NuGet包管理器将Dapper升级到2.0.123及以上版本,新版本已原生支持DateOnly/TimeOnly类型的参数自动映射,无需额外代码修改。

方案2:手动转换参数类型(不升级工具时)

如果暂时无法升级ORM,显式将DateOnly转换为DateTime,并通过匿名类传递参数,避免直接传入包含DateOnly属性的实体对象:

var parameters = new 
{
    CreatedAt = DateTime.Now,
    IssueDate = l_DataEntries.IssueDate.HasValue 
        ? l_DataEntries.IssueDate.Value.ToDateTime(TimeOnly.MinValue) 
        : (DateTime?)null
};

int dataEntryId = dbContext.QueryAsync<int>(DataEntriesQ, parameters).Result.SingleOrDefault();

方案3:处理DateOnly.MinValue的范围问题

针对SQL Server的日期范围限制,对DateOnly.MinValue做特殊处理:

  • 若业务允许,将DateOnly.MinValue替换为SQL Server支持的最小日期new DateOnly(1753, 1, 1)
  • 若表的IssueDate列允许为null,也可直接将该属性设为null替代DateOnly.MinValue

修改后的实体赋值示例:

DataEntry l_DataEntries = new()
{
    CreatedAt = DateTime.Now,
    IssueDate = DateOnly.MinValue 
        ? new DateOnly(1753, 1, 1) 
        : null // 根据业务需求选择替换值或null
};

补充说明

如果使用的不是Dapper,本质问题一致:当前ORM框架未兼容.NET 6+的新值类型,需检查框架版本是否支持,或手动实现类型转换器完成DateOnly到SQL Date的映射。

内容的提问来源于stack exchange,提问作者Kestal

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.25 12:57:35