Для типа.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.
Я не знаю ни одного хука, чтобы изменить этот вывод параметра типа.