原因:
传给数据库的时间类型的值为NULL,或者为DateTime.MinValue
这里的NULL指的是程序代码里面的null,大多数出现这种情况的情景是:在程序里面定义了一个时间类型的变量,没有给赋值,就传给数据库(或存储过程了)。这时这个变量的值默认是赋成了01年01月01日。
测试以下代码:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
//导入SqlDateTime的命名空间
using System.Data.SqlTypes;
namespace ConsoleApplication5
{
class Program
{
static void Main(string[] args)
{
Console.WriteLine(DateTime.MinValue.ToString());
Console.WriteLine(DateTime.MaxValue.ToString());
Console.WriteLine(SqlDateTime.MinValue.ToString());
Console.WriteLine(SqlDateTime.MaxValue.ToSqlString());
}
}
}
输出:
0001-1-1 0:00:00
9999-12-31 23:59:59
1753-1-1 0:00:00
9999-12-31 23:59:59
.NET中 DateTime最小值为: 0001-1-1 0:00:00
数据库中DateTime最小值为: 1753-1-1 0:00:00,
显然.NET中的最小值超出了Sql最小值的最小范围,导致数据溢出的错误。最大值都一样
解决方法:
1、 对日期字段,没赋值的地方或用DateTime.MinValue的地方都换为,SqlDateTime.MinValue
2、 定义一个不程序中不可能用的最小值常量,对日期字段,没赋值的地方或用DateTime.MinValue的地方用此常量
public class DateTimeConst
{
/// <summary>
/// 无效时间(缺省时间)
/// </summary>
public static readonly DateTime INVALID_DATETIME = new DateTime(1900, 1, 1);
}