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

SQL Server datetime2(7)列正常,C#报SqlDateTime溢出错误是什么原因?

根本原因
  • ADO.NET存在默认参数类型映射逻辑:当你未显式指定SQL参数的SqlDbType属性时,传入的C# DateTime 类型值会被默认映射为SqlDbType.DateTime,对应SQL Server旧版datetime类型,而非你数据库实际使用的datetime2类型。
  • 旧版datetime类型的合法取值范围为1753-01-01 00:00:00 至 9999-12-31 23:59:59.997,早于1753年的时间值会直接触发System.Data.SqlTypes.SqlTypeException: SqlDateTime overflow异常,该校验发生在请求提交到数据库之前,和数据库表字段实际设置的datetime2类型无关。
解决方案

原生ADO.NET场景

显式将对应时间参数的SqlDbType指定为DateTime2即可匹配数据库字段类型,示例代码如下:

// 错误写法(默认映射为SqlDbType.DateTime,触发范围校验)
SqlParameter timeParam = new SqlParameter("@CreateTime", dateTimeValue);

// 正确写法(显式指定类型为DateTime2,支持0001-01-01起的时间范围)
SqlParameter timeParam = new SqlParameter("@CreateTime", SqlDbType.DateTime2);
timeParam.Value = dateTimeValue;

EF/EF Core 场景

你需要手动指定实体时间属性对应数据库的字段类型为datetime2:

  • 特性标注方式:在对应属性上添加[Column(TypeName = "datetime2")]特性
  • FluentAPI配置方式:在上下文的OnModelCreating方法中添加配置 Property(e => e.CreateTime).HasColumnType("datetime2");
    EF Core 3.0+版本已默认将C# DateTime类型映射为SQL Server的datetime2类型,若仍出现该问题可按上述方法强制指定类型。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.01 15:15:03