对于 .NET DateTime 类型,为什么推断的数据库类型是 SqlDbTypes.DateTime 而不是 SqlDbTypes.DateTime2?(见http://msdn.microsoft.com/en-us/library/yy6y35y8.aspx)
背景
通过默认使用不太精确的 SQL DateTime 类型,.NET 框架保证,默认情况下,您通过具有未指定 SqlDbType 的 SqlParameter 对象传递的任何 .NET DateTime 值肯定会因精度降低而损坏。这是一个糟糕的设计决定,IMO,考虑到简单地保留全部价值不会产生更糟糕的后果。
例如,我不能使用 SqlParameterCollection.AddWithValue 方法,因为在传递 DateTime 值时,该值会被截断为范围非常有限的 SQL DateTime 值。结果是:
- .NET DateTime 值超出 SQL DateTime 值的允许范围,并且发生错误,或者
- 截断的值不会匹配数据库中更精确的值,也不会正确匹配更新操作的记录,更糟糕的是,IMO,因为它很微妙并且不会产生错误。
问题
由于 .NET DateTime 在精度和范围上都与 SQL Server 2008 数据类型“datetime2(7)”最接近,为什么框架将 SqlParameter 值转换为 SQL DateTime,有没有办法改变默认行为所以我仍然可以使用类型推断功能吗?
我能看到的唯一建议是该功能已损坏,我应该始终明确指定数据类型,这将需要大量代码更改。我想如果框架简单地保留 .NET DateTime 值的原始值,问题会更少。如果数据库字段类型恰好是不太精确的 SQL DateTime 类型,那么传递给查询的日期/时间字符串值将被数据库引擎简单地截断。如果超出范围,您将得到一个错误,正如预期的那样。更重要的是,如果数据库字段类型是 datetime2,那么一切都会顺利进行,记录也会正确匹配。