Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/sql-server-2008/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
对于.NET DateTime类型,为什么推断的数据库类型是SqlDbTypes.DateTime而不是SqlDbTypes.DateTime2?_.net_Sql Server 2008_Datetime_Type Inference_Datetime2 - Fatal编程技术网

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

对于.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类型,为什么推断的数据库类型是SqlDbTypes.DateTime而不是SqlDbTypes.DateTime2?(见附件)

背景 通过将默认值设置为精度较低的SQL DateTime类型,.NET framework保证,在默认情况下,通过具有未指定SqlDbType的SqlParameter对象传递的任何.NET DateTime值都会因精度降低而被损坏。这是一个糟糕的设计决策,IMO,考虑到仅仅保留全部价值不会有更糟糕的后果

例如,我不能使用SqlParameterCollection.AddWithValue方法,因为在传递日期时间值时,该值会被截断为范围非常有限的SQL日期时间值。结果如下:

  • .NET DateTime值超出SQL DateTime值的允许范围,并且发生错误,或者
  • 截断的值将与数据库中更精确的值不匹配,也不会与更新操作的记录正确匹配,更糟糕的是,IMO,因为它很微妙,不会生成错误
问题: 既然.NET DateTime在精度和范围上与SQL Server 2008数据类型“datetime2(7)”最为接近,为什么框架会将SqlParameter值转换为SQL DateTime,并且有没有办法更改默认行为,以便我仍然可以使用类型推断功能?


我能看到的唯一建议是,该功能已被破坏,而我需要进行大量代码更改。我想,如果框架只保留.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中引入的,甚至比这还要晚。