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