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
相关产品推荐
相关产品推荐

