MinValue 和 SqlDateTime 溢出

我不想验证 txtBirthDate,所以我想在数据库中传递 DateTime.MinValue

我的代码:

 if (txtBirthDate.Text == string.Empty)
objinfo.BirthDate = DateTime.MinValue;
else
objinfo.BirthDate =  DateTime.Parse(txtBirthDate.Text);

返回

我收到一个 SQL 错误:

SqlDateTime 溢出。必须在1/1/175312:00:00 AM 和12/31/999911:59:59 PM 之间。

我理解它,但我不明白为什么 DateTime.MinValue返回无效的日期时间,不能插入数据库。如何处理这种情况?

168163 次浏览

基本上,不要使用 DateTime.MinValue来表示缺少的值。不行在 SQLServerDateTime 字段中使用 DateTime.MinValue,因为 SQLServer 的最小值为1753开始。

相反,将 BirthDate属性设置为 Nullable<DateTime>(又名 DateTime?) ,并在没有值时将其设置为 null。还要确保数据库字段可以为空。然后,您只需要确保 null在数据库中以 NULL值的形式结束。具体怎么做取决于你的数据访问权限而你对此一无所知。

来自 MSDN:

1753年1月1日至12月31日的日期和时间数据 精度为一个三百分之一秒,或3.33毫秒 被四舍五入到.000、 .003或.007毫秒的增量。存储 作为两个4字节的整数。前4个字节存储天数 基准日期为1900年1月1日之前或之后 系统的参考日期。日期时间早于1月1日的值, 1753,不允许。其他4个字节存储一天中的时间 表示为午夜后的毫秒数。秒数有 0-59的有效范围。

SQL 对 DateTime 值使用与 C # 不同的系统。

您可以使用 MinValue 作为一个哨兵值——如果它是 MinValue ——将 null 传递给对象(并将日期存储为可为空的数据库)。

if(date == dateTime.Minvalue)
objinfo.BirthDate = null;

使用分机

public static class DateTimeExtensions
{
public static DateTime MinValue(this DateTime sqlDateTime)
{
return new DateTime(1900, 01, 01, 00, 00, 00);
}
}




DateTime date = DateTime.Now;
Console.WriteLine("Minvalue is {0} ", date.MinValue().ToShortDateString());

简单地说,不要使用 DateTime.MinVaue作为默认值。

根据您所处的环境,有几种不同的 MinValues

我曾经有一个项目,在那里我正在实现一个 Windows CE 项目,我使用框架的 DateTime.MinValue(0001年) ,数据库 MinValue(1753年)和 UI 控件 DateTimePicker(我认为它是1970年)。所以至少有 三种不同的最小价值观导致了奇怪的行为和意想不到的结果。(我相信还有第四个!)版本,我只是不记得它来自哪里。).

使用 可为空的数据库字段并将您的值更改为 Nullable<DateTime>。在代码中有 没有有效价值的地方,数据库中也应该有 没有值。:-)

非常简单,避免使用 DateTime.MinValue而是使用 System.Data.SqlTypes.SqlDateTime.MinValue

你可以这样做,虽然有很多方法可以实现。

DateTime? d = null;
if (txtBirthDate.Text == string.Empty)
objinfo.BirthDate = d;
else
objinfo.BirthDate =  DateTime.Parse(txtBirthDate.Text);

注意: 只有当数据库的 datetime 列为 AllowNull 时,此操作才会起作用。否则,您可以为 DateTimed 定义一个标准的最小值。

我正在使用这个函数尝试解析

public static bool TryParseSqlDateTime(string someval, DateTimeFormatInfo dateTimeFormats, out DateTime tryDate)
{
bool valid = false;
tryDate = (DateTime)System.Data.SqlTypes.SqlDateTime.MinValue;
System.Data.SqlTypes.SqlDateTime sdt;
if (DateTime.TryParse(someval, dateTimeFormats, DateTimeStyles.None, out tryDate))
{
try
{
sdt = new System.Data.SqlTypes.SqlDateTime(tryDate);
valid = true;
}
catch (System.Data.SqlTypes.SqlTypeException ex)
{


}
}


return valid;
}

尽管这是一个老问题,但另一种解决方案是对数据库列使用 datetime2。 MSDN 链路

这个嘛... 获取 SQL min 日期非常简单

DateTime sqlMinDateAsNetDateTime = System.Data.SqlTypes.SqlDateTime.MinValue.Value;

如果您使用 DATETIME2,您可能会发现必须将参数明确地作为 DATETIME2传递,否则它可能会有助于将其转换为 DATETIME,并出现相同的问题。

command.Parameters.Add("@FirstRegistration",SqlDbType.DateTime2).Value = installation.FirstRegistration;