对于.NET DateTime类型,为什么推断的数据库类型是SqlDbTypes.DateTime而不是SqlDbTypes.DateTime2?
对于.NET DateTime类型,为什么推断的数据库类型是SqlDbTypes.DateTime而不是SqlDbTypes.DateTime2?(见附件) 背景 通过将默认值设置为精度较低的SQL DateTime类型,.NET framework保证,在默认情况下,通过具有未指定SqlDbType的SqlParameter对象传递的任何.NET DateTime值都会因精度降低而被损坏。这是一个糟糕的设计决策,IMO,考虑到仅仅保留全部价值不会有更糟糕的后果 例如,我不能使用SqlParameterCollection.AddWithValue方法,因为在传递日期时间值时,该值会被截断为范围非常有限的SQL日期时间值。结果如下:对于.NET DateTime类型,为什么推断的数据库类型是SqlDbTypes.DateTime而不是SqlDbTypes.DateTime2?,.net,sql-server-2008,datetime,type-inference,datetime2,.net,Sql Server 2008,Datetime,Type Inference,Datetime2,对于.NET DateTime类型,为什么推断的数据库类型是SqlDbTypes.DateTime而不是SqlDbTypes.DateTime2?(见附件) 背景 通过将默认值设置为精度较低的SQL DateTime类型,.NET framework保证,在默认情况下,通过具有未指定SqlDbType的SqlParameter对象传递的任何.NET DateTime值都会因精度降低而被损坏。这是一个糟糕的设计决策,IMO,考虑到仅仅保留全部价值不会有更糟糕的后果 例如,我不能使用SqlParam
- .NET DateTime值超出SQL DateTime值的允许范围,并且发生错误,或者
- 截断的值将与数据库中更精确的值不匹配,也不会与更新操作的记录正确匹配,更糟糕的是,IMO,因为它很微妙,不会生成错误
我能看到的唯一建议是,该功能已被破坏,而我需要进行大量代码更改。我想,如果框架只保留.NETDateTime值的原始值,问题就会少一些。如果数据库字段类型恰好是不太精确的SQL DateTime类型,则传递给查询的日期/时间字符串值将被数据库引擎截断。如果超出范围,您将得到一个错误,正如预期的那样。更重要的是,如果数据库字段类型为datetime2,则一切都将顺利进行,记录将正确匹配。SqlDbTypes.DateTime 1与其他设置冲突。
datetime2
仅在SQL Server 2008中添加
SqlDbType.DateTime2
仅在.NET 3.5中添加到.NET
在现有的每个.NET2.0/3.0应用程序上,改变这一点将是一个破坏性的行为改变
我不知道有任何钩子可以更改该类型参数推断。我正在查看框架代码,在我看来,它需要做的只是在SqlParameter类的GetMetaTypeFromValue方法中的对象类型的switch语句中返回MetaDateTime2实例,而不是MetaDateTime,这基本上就是SqlDbType属性获取其值的地方。由于MetaDateTime2实例存在,并且显然是受支持的,在我看来GetMetaTypeFromValue只是返回MetaDateTime,而不是纯粹出于恶意返回MetaDateTime2,事实上,
datetime2
是在SQL Server 2008中引入的,甚至比这还要晚。