.NET DateTime 型の場合、推論されたデータベース型が SqlDbTypes.DateTime2 ではなく SqlDbTypes.DateTime になるのはなぜですか? ( http://msdn.microsoft.com/en-us/library/yy6y35y8.aspxを参照)
バックグラウンド
精度の低い SQL DateTime 型にデフォルト設定することにより、.NET フレームワークは、デフォルトで、指定されていない SqlDbType を持つ SqlParameter オブジェクトを介して渡される .NET DateTime 値が、精度の低下によって確実に破損することを保証します。単純に完全な値を保持することで悪い結果が生じることはないことを考えると、これは悪い設計上の決定です。
たとえば、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 の場合、すべてがスムーズに流れ、レコードが適切に一致することです。