【.NET】SqlDateTime 溢出。必须介于 1/1/1753 12:00:00 AM 和 12/31/9999 11:59:59 PM之间
#背景
向sqlserver数据库中一个datetime字段插入DateTime.MinValue时,
出现问题:
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的最大小时间:
1 DateTime t=new DateTime(); 2 DateTime t1 = DateTime.MinValue; 3 DateTime t2 = DateTime.MaxValue; 4 DateTime t3 = (DateTime)System.Data.SqlTypes.SqlDateTime.MinValue; 5 DateTime t4 = (DateTime)System.Data.SqlTypes.SqlDateTime.MaxValue; 6 Console.WriteLine(".net中DateTime默认值{0}", t); 7 Console.WriteLine(".net最小时间为{0}", t1); 8 Console.WriteLine(".net最大时间为{0}", t2); 9 Console.WriteLine("SQL最小时间为{0}", t3); 10 Console.WriteLine("SQL最大时间为{0}", t4);
输出效果:
#解决方法
1、确保Datetime类型变量赋值后,再向数据库更新数据;
2、如果数据库中数据类型为Datetime,如果想插入最小值,那在程序中使用System.Data.SqlTypes.SqlDateTime.MinValue替代System.DateTime.MinValue,这样SqlDateTime的MinValue和Sql中DateTime的范围吻合,就不会再出现以上的错误了。也可以将数据库中的Datetime类型修改为Datetime2类型,这样使用System.DateTime.MinValue就不会出现超出范围的情况了;
3、通常情况下,我们不在日期字段里存入空值.当没有日期值时存入'1900-1-1',这个叫做默认时间值。在读取数据的时候,遇到1900-1-1就认为数据库该时间字段没有值;
insert into 表名 (Datetime字段名) values (cast(nullif('程序中传入的时间类型变量','')) as DateTime)
作者:willingtolove
出处:http://www.cnblogs.com/willingtolove/
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。