Для типа.NET DateTime, почему выводимый тип базы данных SqlDbTypes.DateTime вместо SqlDbTypes.DateTime2?

Для типа.NET DateTime, почему выводимый тип базы данных SqlDbTypes.DateTime вместо SqlDbTypes.DateTime2? (См. http://msdn.microsoft.com/en-us/library/yy6y35y8.aspx)

Фон

По умолчанию для менее точного типа SQL DateTime платформа.NET гарантирует, что по умолчанию любое значение.NET DateTime, которое вы передаете через объект SqlParameter с неопределенным SqlDbType, обязательно будет повреждено из-за снижения точности. Это плохое проектное решение, IMO, учитывая, что не будет худших последствий, если просто сохранить полную стоимость.

Например, я не могу использовать метод 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, тогда все пройдет гладко и записи будут соответствовать должным образом.

2 ответа

datetime2 был добавлен только в SQL Server 2008.

SqlDbType.DateTime2 был добавлен в.NET только в.NET 3.5.

Изменение этого было бы критическим изменением поведения в каждом существующем приложении.NET 2.0/3.0.

Я не знаю ни одного хука, чтобы изменить этот вывод параметра типа.

SqlDbTypes.DateTime 1 конфликтует с другими настройками.

Другие вопросы по тегам