我不想验证txtBirthDate
所以我想在数据库中传递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
返回无法在数据库中插入的无效日期时间。如何处理这种情况?
答案 0 :(得分:79)
基本上,请勿使用DateTime.MinValue
来表示缺失值。您无法在SQL Server DateTime字段中使用DateTime.MinValue
,因为SQL Server的最小值为1753的开头。
相反,将BirthDate
属性设为Nullable<DateTime>
(又名DateTime?
),并在没有值时将其设置为null
。还要确保您的数据库字段可以为空。然后,您只需确保null
最终作为数据库中的NULL
值。具体如何做到这一点取决于您的数据访问权限,而您尚未告诉我们任何相关信息。
答案 1 :(得分:71)
非常简单,请避免使用DateTime.MinValue
代替System.Data.SqlTypes.SqlDateTime.MinValue
。
答案 2 :(得分:9)
虽然这是一个老问题,但另一个解决方案是将datetime2用于数据库列。 MSDN Link
答案 3 :(得分:3)
这是你能做的。虽然有很多方法可以实现它。
DateTime? d = null;
if (txtBirthDate.Text == string.Empty)
objinfo.BirthDate = d;
else
objinfo.BirthDate = DateTime.Parse(txtBirthDate.Text);
注意:仅当您的数据库日期时间列为Allow Null时,此选项才有效。否则,您可以为DateTime d。
定义标准最小值
答案 4 :(得分:3)
我正在使用此函数来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;
}
答案 5 :(得分:2)
来自MSDN:
日期和时间数据,从1753年1月1日到9999年12月31日,带有 准确度为三百分之一秒,或3.33毫秒。值 四舍五入到.000,.003或.007毫秒的增量。存储 作为两个4字节整数。前4个字节存储天数 在基准日期之前或之后,即1900年1月1日。基准日期是 系统的参考日期。日期时间早于1月1日的值, 1753年,不允许。其他4个字节存储一天中的时间 表示为午夜后的毫秒数。秒钟有 有效范围为0-59。
对于DateTime值,SQL使用与C#不同的系统。
您可以将MinValue用作标记值 - 如果它是MinValue - 将null传递给您的对象(并将日期存储为可以在数据库中为空)。
if(date == dateTime.Minvalue)
objinfo.BirthDate = null;
答案 6 :(得分:2)
简单地说,不使用DateTime.MinVaue
作为默认值。
根据您所处的环境,有几个不同的MinValues
。
我曾经有一个项目,在那里我实现了一个Windows CE项目,我使用的是框架的DateTime.MinValue
(年份0001),数据库MinValue
(1753)和一个UI控件{{1 (我认为是1970年)。所以至少有 3个不同的MinValues 会导致奇怪的行为和意外的结果。 (而且我相信甚至有第四个(!)版本,我只是不记得它来自哪里。)。
使用可空的数据库字段,然后将您的值更改为DateTimePicker
。如果代码中无效值,则不也应该是数据库中的值。 : - )
答案 7 :(得分:1)
如果使用DATETIME2,您可能会发现必须像DATETIME2那样专门传递参数,否则它可能会有用地将其转换为DATETIME并出现相同的问题。
command.Parameters.Add("@FirstRegistration",SqlDbType.DateTime2).Value = installation.FirstRegistration;
答案 8 :(得分:0)
嗯......获得SQL最短日期非常简单
DateTime sqlMinDateAsNetDateTime = System.Data.SqlTypes.SqlDateTime.MinValue.Value;
答案 9 :(得分:-6)
使用扩展程序
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());