15

У нас действительно странное и непоследовательное поведение с Linq-to-SQL здесь.Linq-to-SQL и weptness DateTime

Наше приложение установлено на нескольких сайтах клиентов, и оно отлично работает по большей части. Один из запросов в Linq-to-SQL обновляет таблицу и устанавливает столбец DateTime в новое значение.

Во всех случаях - в том числе наших систем разработки и тестирования - это утверждение Linq к 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 ..... и эта настройка одинакова в другом месте (например, на наша тестовая серверная инфраструктура).

Так что мой вопрос на самом деле:

  1. Почему на земле делает Linq к SQL вдруг создать совершенно другое представление того же DateTime отправить в SQL Server? Есть ли ручка для управления этим?

  2. И почему ADO.NET и база данных SQL Server 2005 с пакетом обновления 2 (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 счастливо работает нормально .....

Update: некоторое дальнейшее исследование, кажется, указывает Linq- к SQL ведет себя по-разному при переходе от SQL Server 2005 или 2008

  • с SQL Server 2005 , наши даты заводятся в: Nov 4 2011 02:15:25PM
  • с SQL Server 2008 , наши даты превращаются в: 2011-11-04 02:15:25PM
+0

Проверьте настройки CurrentCulture для приложений C#/VB.NET. –

+0

@BogdanSahlean: 'CurrentCulture' установлен в' InvariantCulture' на всех системах –

+0

Я согласен, что это проблема .NET, а не SQL. Вероятно, ошибка в LINQ2SQL забывает использовать инвариантную культуру где-то. Соответствуют ли настройки местоположения Windows? – leppie

ответ

3

Я думаю, что вы можете преследовать неправильную проблему.

Я бы сначала проверить:

  1. Ваша LINQ to SQL схема модель/база данных является точной.
  2. Ваша логика проблемы, чтобы убедиться, что новое значение DateTime не может быть вне диапазона. В частности, убедитесь, что он не может быть DateTime.MinValue или DateTime.MaxValue.
  3. То, что вы не выполняете синтаксический анализ строк в вашем приложении.
  4. У сервера SQL   нет триггеров (в частности, вместо триггеров , которые могут быть изменены в заявлении об обновлении).

Я угадываю вас (или вашего клиента), начиная с получения переполнения SqlTypeException - SqlDateTime. Должно быть от 1/1/1753 12:00:00 AM и 12/31/9999 11:59:59 PM 'сообщение об ошибке, и при расследовании вы заметили разницу в том, как отображаются даты.

Вы не указали, откуда поступает информация, поэтому я предполагаю что-то вроде профилировщика SQL.

Однако проблема отображения даты может быть красношейной, поскольку это не должно быть проблемой.

с SQL Server 2005, наши даты заводятся в: 4 Ноя 2011 2:15:25 PM

с SQL Server 2008, наши даты заводятся в: 2011-11-04 02:15:25 PM

Я не уверен, что вы имеете в виду под этим. SQL не 'turn' указывает на строку, поскольку она не хранит даты как строки, но внутреннее представление - это число (что-то вроде количества дней с 1 января 1900 года).

Если вы имеете в виду ваши даты, то получите as 4 ноя 2011 02:15:25 PM, то это зависит от программы, отображающей информацию.

Кроме того, насколько я понимаю, если вы используете параметр DateTime (который LINQ   -   SQL должен выполняться, если модель базы данных является точной), тогда информация, отправляемая от клиента на SQL Server, SQL-числовое представление DateTime. Это должно избегать любых проблем с преобразованием даты и времени между клиентом и сервером. Когда вы смотрите, например, SQL Profiler, он не показывает числовое представление даты, что будет очень мало для большинства людей, но пытается быть полезным и отображает значение в виде строки.

Важным моментом является то, что если профайлер SQL или SQL позволяет отобразить параметр datetime как «4 ноября 2011 года 02:15:25 PM», тогда он знает, что это действительная дата, и он точно знает, что это за дата.

Поэтому я подозреваю, что проблема с форматом отображения, вероятно, не имеет значения.

Тогда возникает вопрос, почему ваш клиент получает сообщение об ошибке переполнения SqlTypeException - SqlDateTime.

Первое, что нужно сделать, это проверить, какое значение даты вы устанавливаете, что необходимо сделать на уровне приложения, а не на сервере SQL Server, так как оно не получилось так далеко.(Это еще одна причина, по которой я не думаю, что это проблема конфигурации SQL.)

похоже, что .NET не может действительно интерпретировать, что 4 ноября 2011 года 02:15:25 PM как действительное DateTime по какой-либо причине

Я не вижу, где .NET бы даже пытается интерпретировать строки в качестве даты, если у вас есть какие-то DateTime.Parse команды, и если это так, то проблема не имеет ничего общего ни с помощью LINQ или SQL.

+0

(2) DateTime устанавливается на что-то вроде 'DateTime.Now.AddMinutes (5)', поэтому я уверен, что это не «вне диапазона» –

+0

он говорит, что .NET превращает дату в строковое представление для использования в update, а не то, что SQL превращает его в строку. И, что .NET выпускает другой формат строки даты для SQL 2005 по сравнению с 2008 годом и что SQL 2005 не понимает запрос, потому что формат, похоже, не является чем-то, что он понимает. –

+0

@marc_s Я знаю, что это маловероятно, но есть ли шанс DateTime.Now может быть вне диапазона, то есть дата компьютера/сервера неверна? – sgmoore

Смежные вопросы