У нас действительно странное и непоследовательное поведение с Linq-to-SQL здесь.
Наше приложение установлено на нескольких сайтах клиентов, и оно работает отлично по большей части. Один из запросов в Linq-to-SQL обновляет таблицу и устанавливает столбец DateTime
для нового значения.
Во всех случаях, включая наши системы разработки и тестирования, этот оператор Linq-to-SQL преобразуется во что-то в соответствие с:
UPDATE dbo.OurTable
SET WorkTimeStamp = @WTS
WHERE ID = @ID
@WTS = '2011-11-04 14:15:25', @ID = 555
Однако на одном сайте клиента по причинам, которые нам пока не ясны, это обновление переводится на:
UPDATE dbo.OurTable
SET WorkTimeStamp = @WTS
WHERE ID = @ID
@WTS = 'Nov 4 2011 02:15:25PM', @ID = 555
и по какой-то причине сбой на SQL Server 2005.
Теперь на серверах клиентов (веб-сервере и SQL Server) установлены англо-английские версии Windows Server 2008; для языка SQL Server установлено значение us_english
, для формата даты установлено значение mdy
, учетная запись пользователя, использующая обновление, имеет свой язык, установленный на English
в SQL Server..... и эта настройка одинакова в другом месте (например, на нашей тестовой серверной инфраструктуре).
Итак, мой вопрос:
-
Почему на земле Linq-to-SQL внезапно создает совершенно другое представление того же
DateTime
для отправки на SQL Server? Есть ли какая-нибудь ручка для управления этим? -
И почему ADO.NET и база данных SQL Server 2005 SP2 не могут корректно обрабатывать этот оператор
UPDATE
? Мы получаем ошибку в нашем журнале, который гласит:
SqlTypeException - переполнение SqlDateTime. Должно быть между 1/1/1753 12:00:00 AM и 12/31/9999 11:59:59 PM.
Кажется, это ошибка .NET(больше, чем ошибка SQL Server), и кажется, что .NET не может действительно интерпретировать этот Nov 4 2011 02:15:25PM
как допустимый DateTime
по какой-либо причине. При попытке запустить сгенерированный оператор UPDATE в SQL Server Management Studio мы не можем "заставить" эту ошибку произойти - UPDATE
счастливо работает просто отлично.....
Обновление: Некоторое дальнейшее исследование, похоже, указывает на то, что Linq-to-SQL ведет себя по-разному, когда идет против SQL Server 2005 или 2008.
- с SQL Server 2005 наши даты преобразуются в:
Nov 4 2011 02:15:25PM
- с SQL Server 2008 наши даты преобразуются в:
2011-11-04 02:15:25PM