DateTime.MinValue和SqlDateTime溢出

Shr*_*ree 51 c# sql-server datetime

我不想验证txtBirthDate所以我想传入DateTime.MinValue数据库.

我的代码:

 if (txtBirthDate.Text == string.Empty)
    objinfo.BirthDate = DateTime.MinValue;
 else
     objinfo.BirthDate =  DateTime.Parse(txtBirthDate.Text);
Run Code Online (Sandbox Code Playgroud)

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返回无法在数据库中插入的无效日期时间.如何处理这种情况?

Jon*_*eet 81

基本上,不要DateTime.MinValue用来表示缺失值.你不能使用DateTime.MinValue在SQL Server DateTime字段,如SQL Server有1753年开始的最小值.

相反,将您的BirthDate属性设为Nullable<DateTime>(aka DateTime?),并null在没有值时将其设置为.还要确保您的数据库字段可以为空.然后你只需要确保它null最终成为NULL数据库中的值.具体如何,这取决于您的数据访问权限,您没有告诉我们任何相关信息.

  • 如果省略了`OperationContract`的`DateTime`参数,WCF会自动采用`DateTime.MinValue`.此外,WCF不接受`Nullable <T>`参数.这意味着在每个`OperationContract`中你被迫做一些像`if(myDate <SqlDateTime.MinValue)myDate = SqlDateTime.MinValue;`的东西.当然,现在,您与SqlServer紧密耦合.似乎这个转换应该在收到日期<最小日期时由DBAL或SqlServer本身自动完成.但是,它没有,因此我们的选择是有限的. (3认同)
  • @crush:您是否必须直接将WCF模型和SQL模型结合在一起?我怀疑我有一个"逻辑"模型有一个`Nullable <DateTime>`,当我需要使用WCF时转换为/.并不是说我已经使用了很多WCF,但是对于WCF的局限性渗透到模型的其他部分感觉是个坏主意. (2认同)
  • @crush:我建议如果你想在你的逻辑模型中表示一个`Nullable <DateTime>`,并且WCF不允许你这样做,那么你应该把它修复为接近WCF边界可能.如果SQL Server不允许您表示逻辑模型的其他方面,则应将*那些*尽可能靠近数据库边界.使用尽可能多的代码的逻辑表示,IMO. (2认同)

San*_*r M 77

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

  • 如果要在`DateTime?`类型字段中赋值,请使用`System.Data.SqlTypes.SqlDateTime.MinValue.Value` (9认同)

Abh*_*mar 10

虽然这是一个老问题,但另一种解决方案是将datetime2用于数据库列. MSDN链接


Ric*_*ker 10

嗯……获取 SQL 最小日期非常简单

DateTime sqlMinDateAsNetDateTime = System.Data.SqlTypes.SqlDateTime.MinValue.Value;
Run Code Online (Sandbox Code Playgroud)