对于.NET DateTime类型,为什么推断的数据库类型为SqlDbTypes.DateTime而不是SqlDbTypes.DateTime2?

时间:2011-12-07 19:31:05

标签: .net sql-server-2008 datetime type-inference datetime2

对于.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,并且是否存在改变默认行为的方法,所以我仍然可以使用类型推断功能?

我能看到的唯一建议是功能被破坏而我should always explicitly specify the data type,这将需要大量的代码更改。我想如果框架只保留.NET DateTime值的原始值,那么问题会更少。如果数据库字段类型恰好是不太精确的SQL DateTime类型,则传递给查询的日期/时间字符串值将被数据库引擎截断。如果超出范围,您将收到错误,如预期的那样。更重要的是,如果数据库字段类型是datetime2,那么一切都将顺利流动,记录将正确匹配。

2 个答案:

答案 0 :(得分:1)

datetime2仅在SQL Server 2008中添加。

仅在.NET 3.5中将

SqlDbType.DateTime2添加到.NET。

更改这可能是每个现有.NET 2.0 / 3.0应用程序的重大行为更改。

我不知道有任何改变该类型参数推断的钩子。

答案 1 :(得分:0)

SqlDbTypes.DateTime 1与其他设置冲突。