您的位置:首页 > 其它

从 datetime2 数据类型到 datetime 数据类型的转换产生一个超出范围的值。 语句已终止。

2016-11-18 12:05 549 查看
SP.NET MVC项目中,使用entity framework添加数据遇到“从
datetime2 数据类型到 datetime 数据类型的转换产生一个超出范围的值”这个错误问题。后经过问题的排查,是由于C#代码中实体类所传入的DateTime类型属性没有赋值的原因,其中主要涉及到SQL Server
中datetime2的时间精度和日期范围的问题

在c#中,如果实体类的属性没有赋值,一般都会取默认值,比如int类型的默认值为0,string类型默认值为null, 那DateTime的默认值呢?由于DateTime的默认值为"0001-01-01",所以entity framework在进行数据库操作的时候,在传入数据的时会自动将原本是datetime类型的数据字段转换为datetime2类型(因为0001-01-01这个时间超出了数据库中datetime的最小日期范围),然后在进行数据库操作。问题来了,虽然EF已经把要保存的数据自动转为了datetime2类型,但是数据库中表的字段还是datetime类型!所以将datetime2类型的数据添加到数据库中datetime类型的字段里去,就会报错并提示转换超出范围。

eg:

Item.ModifyDate = "{0001/1/1 0:00:00}";        // 此为 datetime2类型.  datetime2的日期范围是"0001-01-01 到 9999-12-31"

而数据库上是   ModifyDate datetime      //  datetime的日期范围是:”1753
年 1 月 1 日到 9999 年 12 月 31 日“

这样做就等于把 datetime2赋值给datetime  数据库类型转换就会错误.

根本原因就是没有赋值.  

解决方法: 

public DateTime? ModifyDate { get; set; }

改为

public DateTime ModifyDate { get; set; }

其他解决方法:

C#代码中 DateTime类型的字段在作为参数传入到数据库前记得赋值,并且的日期要大于1753年1月1日。
C#代码中 将原本是DateTime类型的字段修改为DateTime?类型,由于可空类型的默认值都是为null,所以传入数据库就可以不用赋值,数据库中的datetime类型也是支持null值的。
修改数据库中表的字段类型,将datetime类型修改为datetime2类型

参考:
http://shiyousan.com/post/635391523296425502
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐