/*十有三博客*/
  • 首页
  • 关于本站
  • 网站地图
  • RSS订阅

从 datetime2 数据类型到 datetime 数据类型的转换产生一个超出范围的值

2014-06-23 十有三 0 浏览:2万+ .NET技术 SQL Server | C#

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

触发该错误的条件如下:

  1. SQL Server数据库版本中有datetime2类型
  2. 数据库中,某个要进行添加或者修改操作的字段的数据类型为datetime,比如表Table1中的InputDate字段,类型为datetime。
  3. 后台代码进行数据库操作时,传入的实体对象的DateTime类型的属性没有赋值,比如有一实体类Test,该类下有个InputDate属性,类型为DateTime。
  4. 最后使用entity framework对这个dateime类型的字段进行添加和修改操作就会出现此问题。

问题解析

一般之所以会报错数据类型转换产生一个超出范围的值,都是因为数据的大小和范围超出要转换的目标的原因。我们先看datetime2和datetime这两个数据类型的具体区别在哪里。

 

官方MSDN对于datetime2的说明:定义结合了 24 小时制时间的日期。 可将 datetime2 视作现有 datetime 类型的扩展,其数据范围更大,默认的小数精度更高,并具有可选的用户定义的精度。

 

这里值的注意的是datetime2的日期范围是"0001-01-01 到 9999-12-31"(公元元年 1 月 1 日到公元 9999 年 12 月 31 日)。而datetime的日期范围是:”1753 年 1 月 1 日到 9999 年 12 月 31 日“。这里的日期范围就是造成“从 datetime2 数据类型到 datetime 数据类型的转换产生一个超出范围的值”这个错误的原因!!!

 

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

多种解决方案

这个问题的解决方法是很多的,关键是适合自己的业务逻辑和需求:

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

作者:十有三

出处:https://shiyousan.com/post/635391523296425502

版权声明:本文采用知识共享许可协议:署名-相同方式共享 4.0 国际(CC BY-SA 4.0)。欢迎转载本文,转载请声明出处或保留此段声明。


  • 上一篇: ASP.NET 301跳转或者进行301重定向/转向的方法
  • 下一篇: C#中如何排除/过滤/清空/删除掉字符串数组中的空字符串

相关文章
  • 解决Visual Studio快捷键Ctrl+Alt+L与QQ热键冲突
  • ASP.NET MVC如何实现带www域名重定向到不带www顶级域名
  • ASP.NET MVC AJAX调用没有反应和返回结果
  • asp.net动态添加meta标签
  • IIS8通过ARR和URL重写模块实现不同站点之间的POST请求重写
  • C#中将自定义日期和时间格式的字符串转换成日期DateTime类型

文章分类

.NET技术 123 数据库 24 Web前端 21 网站建设运维 37 操作系统与应用 66 程序猿日常 11 开发工具 12 其他随笔 13

文章标签

ASP.NET ASP.NET MVC C# CSS HTML IIS Javascript Linux MongoDB MySql SQL SQL Server Visual Studio Windows系统 版本控制系统 插件工具 服务器 搞笑娱乐 好文分享 软件应用 生活知识 手机问题 随笔 网络知识 网站设计优化 网站维护 养生保健 异常处理 硬件设备 游戏攻略

热门文章

  • IIS8如何安装和使用URL重写工具-URL Rewrite
  • 林蛋大与楚中天,朱肚皮与朱月坡
  • 解决IE11安装升级失败和在安装前需要更新的问题
  • Windows Server 2012无法安装 .NET3.5-安装角色或功能失败,找不到源文件
  • VS重构重命名的快捷键

推荐文章

  • 解决VS2013编码遇到无法嵌入互操作类型“ChinaPay_NET.NetPayClientClass”请改用适用的接口的问题
  • 开发趣事:帐号(帐户)和账号(账户)的区别引发的强迫症事件
  • Win10 自动换壁纸软件失效-无法换壁纸并被强制切换为默认壁纸
  • ASP.NET中Page设置ValidateRequest="false" 无效
  • 连续收到邮件和短信通知需要添加网页底部备案编号链接

友情链接

  • Passingwind的博客
  • 码友网

知识共享许可协议 CC BY-SA 4.0本站作品采用知识共享许可协议:署名-相同方式共享 4.0 国际(CC BY-SA 4.0)。
闽ICP备15003702号
闽公网安备 35020302035102号