架构师_程序员_码农网

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 12222|回复: 1

[资料] spring.net nhibernate sqldatetime溢出解决方案

[复制链接]
发表于 2017-9-13 14:34:58 | 显示全部楼层 |阅读模式
SqlDateTime 溢出。必须介于 1/1/1753 12:00:00 AM 和 12/31/9999 11:59:59 PM之间


QQ截图20170913142420.png

在从网站执行更新操作的时候,一直报错,我一开始以为是xml配置或者在sql语句执行的时候出了什么问题

我试着用sql查询分析器,抓了一下生成的sql语句,发现,能正确执行,到底是哪里的问题呢?sql语句如下:

exec sp_executesql N'INSERT INTO dbo.LeanLogs (Version, OrganizationId, CustomInfoId, LastLeanAlarmType, NowLeanAlarmType, InsertTime, TreatedTime) VALUES (@p0, @p1, @p2, @p3, @p4, @p5, @p6); select SCOPE_IDENTITY()',N'@p0 int,@p1 int,@p2 int,@p3 int,@p4 int,@p5 datetime,@p6 datetime',@p0=1,@p1=35,@p2=12,@p3=10,@p4=10,@p5='2017-09-13 13:09:41',@p6=NULL
SqlDateTime 溢出。必须介于 1/1/1753 12:00:00 AM 和 12/31/9999 11:59:59 PM之间---解决办法

错误原因

    传给数据库的时间类型的值为NULL,或者为DateTime.MinValue插入或者更新数据库时,datetime字段值为空默认插入0001年01月01日造成datetime类型溢出。
    这里的NULL指的是程序代码里面的null,大多数出现这种情况的情景是:在程序里面定义了一个时间类型的变量,没有给赋值,就传给数据库(或存储过程了)。这时这个变量的值默认是赋成了01年01月01日。
     由于数据库中DateTime类型字段,最小值是1/1/1753 12:00:00,而.NET Framework中,DateTime类型,最小值是1/1/0001 0:00:00,显然,超出了sql的值的最小值范围,导致数据溢出错误。
    我们来看看如何通过C#看.net和sql的最大小时间:


输出效果:

20160310192434228.png

最后,捣鼓了十几分钟吧,

最后错误原因如下:

对象的其中一个属性类型也是对象,也就是表有外键,外键表新加了一个datetime的属性,并没有赋值,也没有设置为可空类型

在新增或者更新对象的时候,外键对象的datetime自动附上了默认值,由于.net默认值的时间比数据库的默认最小时间还要小

解决办法:在外键对象的一个datetime类型的属性设置为可空类型,帮同事完美解决!







上一篇:.net/c# 操作redis缓存增删改查[源码]
下一篇:asp.net 网站异常错误分析
码农网,只发表在实践过程中,遇到的技术难题,不误导他人。
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

免责声明:
码农网所发布的一切软件、编程资料或者文章仅限用于学习和研究目的;不得将上述内容用于商业或者非法用途,否则,一切后果请用户自负。本站信息来自网络,版权争议与本站无关。您必须在下载后的24个小时之内,从您的电脑中彻底删除上述内容。如果您喜欢该程序,请支持正版软件,购买注册,得到更好的正版服务。如有侵权请邮件与我们联系处理。

Mail To:help@itsvse.com

QQ|手机版|小黑屋|架构师 ( 鲁ICP备14021824号-2 )|网站地图

GMT+8, 2024-4-26 14:16

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表