Подтвердить что ты не робот

Для типа .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, обязательно будет повреждено с помощью сокращения в точности. Это плохое дизайнерское решение, ИМО, учитывая отсутствие худших последствий, просто сохраняя полную ценность.

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

4b9b3361

Ответ 1

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

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

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

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

Ответ 2

SqlDbTypes.DateTime 1 противоречит другим настройкам.