DateTime.MinValue和SqlDateTime溢出

我不想validationtxtBirthDate所以我想在数据库中传递DateTime.MinValue

我的代码:

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

DateTime.MinValue返回Date = {1/1/0001 12:00:00 AM}

我有一个SQL错误:

SqlDateTime溢出。 必须介于1/1/1753 12:00:00 AM和12/31/9999 11:59:59 PM之间。

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

基本上,不要使用DateTime.MinValue来表示缺less的值。 您不能在SQL Serverdate时间字段中使用DateTime.MinValue ,因为SQL Server具有1753开头的最小值。

相反,使您的BirthDate属性为Nullable<DateTime> (又名DateTime? ),并将其设置为null ,如果没有值。 还要确保你的数据库字段是空的。 然后你只需要确保null在数据库中以NULL值结束。 具体怎么做取决于你的数据访问,你没有告诉我们任何事情。

很简单,避免使用DateTime.MinValue来代替使用System.Data.SqlTypes.SqlDateTime.MinValue

虽然这是一个老问题,但另一个解决scheme是使用datetime2作为数据库列。 MSDN链接

这是你可以做的。 虽然有很多方法来实现它。

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

注意:只有当您的数据库date时间列为允许空值时才能使用。 否则,您可以为DateTime d定义一个标准的最小值。

我正在使用这个函数tryparse

 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; } 

来自MSDN:

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

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

您可以使用MinValue作为定点值 – 如果它是MinValue – 将null传递给对象(并将date存储在数据库中)。

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

简而言之, 不要使用DateTime.MinVaue作为默认值。

有几个不同的MinValues在那里,取决于你在哪个环境。

我曾经有一个项目,我正在实施一个Windows CE项目,我使用框架的DateTime.MinValue (0001年),数据库MinValue (1753年)和一个UI控制DateTimePicker (我认为是1970年)。 所以至less有3个不同的MinValues导致了奇怪的行为和意想不到的结果。 (我相信甚至有第四个(!)版本,我只是不记得它来自哪里)。

使用一个可为空的数据库字段 ,并将其值更改为Nullable<DateTime> 。 在代码中没有有效值的地方 ,数据库中也不应该有值。 🙂

那么…它的丑陋; 但它的简单和它的工作原理,并得到一个.Net DateTime对象中有效的SQL最小date。

 DateTime sqlMinDateAsNetDateTime = DateTime.Parse(System.Data.SqlTypes.SqlDateTime.MinValue.ToString()) 

使用扩展

 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());