对于.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 Server 2008数据类型“datetime2(7)”最为接近,为什么框架会将SqlParameter值转换为SQL DateTime,并且是否存在改变默认行为的方法,所以我仍然可以使用类型推断功能?
我能看到的唯一建议是功能被破坏而我should always explicitly specify the data type,这将需要大量的代码更改。我想如果框架只保留.NET DateTime值的原始值,那么问题会更少。如果数据库字段类型恰好是不太精确的SQL DateTime类型,则传递给查询的日期/时间字符串值将被数据库引擎截断。如果超出范围,您将收到错误,如预期的那样。更重要的是,如果数据库字段类型是datetime2,那么一切都将顺利流动,记录将正确匹配。
答案 0 :(得分:1)
datetime2
仅在SQL Server 2008中添加。
SqlDbType.DateTime2
添加到.NET。
更改这可能是每个现有.NET 2.0 / 3.0应用程序的重大行为更改。
我不知道有任何改变该类型参数推断的钩子。
答案 1 :(得分:0)
SqlDbTypes.DateTime 1与其他设置冲突。