Linq-To-Sql проблема с datetime? - PullRequest
       23

Linq-To-Sql проблема с datetime?

1 голос
/ 23 октября 2009

Хорошо, я использую SQL Server Express 2008 и .Net 3.5 (c #)

У меня есть пара полей datetime в базе данных, и я пытаюсь внести изменения в строку (используя Linq-to-Sql), я получаю сообщение об ошибке «Строка не найдена или изменена».

Я потратил некоторое время на получение сгенерированного SQL, и кажется, что проблема вызвана миллисекундами, прикрепленными к дате и времени.

Сгенерированный SQL, который не работает,

 @p5: Input DateTime (Size = 0; Prec = 0; Scale = 0) [20/10/2009 16:04:45]
 @p6: Input DateTime (Size = 0; Prec = 0; Scale = 0) [23/10/2009 10:15:36]
 @p7: Input DateTime (Size = 0; Prec = 0; Scale = 0) [23/10/2009 09:27:27]

AND ([SignUpDate] = @p5) 
AND ([LastActivityDate] = @p6) 
AND ([LastLoginDate] = @p7) 

если я сам изменю его так, как оно работает,

 @p5: Input DateTime (Size = 0; Prec = 0; Scale = 0) [20/10/2009 16:04:45.390]
 @p6: Input DateTime (Size = 0; Prec = 0; Scale = 0) [23/10/2009 10:15:36.733]
 @p7: Input DateTime (Size = 0; Prec = 0; Scale = 0) [23/10/2009 09:27:27.747]

AND ([SignUpDate] = @p5) 
AND ([LastActivityDate] = @p6) 
AND ([LastLoginDate] = @p7) 

Каковы мои варианты способов обойти это?

Просто чтобы добавить это мой код редактирования,

var UserToEdit = this.GetUser(UserId);

UserToEdit.Forename = Fields["Forename"];
UserToEdit.Surname = Fields["Surname"];
UserToEdit.DateOfBirth = Convert.ToDateTime(Fields["DateOfBirth"]);
UserToEdit.DisplayName = Fields["DisplayName"];
UserToEdit.TelephoneNumber = Fields["TelephoneNumber"];

_db.SubmitChanges();

Ответы [ 5 ]

4 голосов
/ 23 октября 2009

Смотрите эту ссылку,

System.Data.Linq.ChangeConflictException: строка не найдена или изменена

# High precision datetime fields are used. The solution is to set

UpdateCheck, чтобы никогда не для этого столбца ваш файл DBML

Это решило мою проблему, но немного похоже на взлом.

Я оставляю это открытым, чтобы посмотреть, что думают другие.

1 голос
/ 29 июля 2011

Check this post . Это объясняет, что нам нужно следить за столбцами DateTime, проверять различные типы данных между dbml и вашей базой данных, и, наконец, объясняет оптимистический параллельный подход LinQ.

0 голосов
/ 05 августа 2016

В основном схема MSSQL и контекст данных Linq не работают должным образом в упомянутой конфигурации. Вы можете изменить схему БД или контекст данных.

Изменить тип данных MSSQL

Мы используем smalldatetime вместо datetime , когда можно использовать точность 1 минуты .

Изменить контекст данных LINQ на SQL

Если вам нужна более высокая точность, чем 1 минута, посмотрите на собственный ответ LiamB на установите UpdateCheck на Never для столбца в контексте данных.

0 голосов
/ 23 октября 2009

Поскольку единственное отличие в вашем примере - это миллисекунды, я бы использовал SQL Profiler, чтобы определить, возвращает ли исходное значение Select значение миллисекунд. Тогда посмотри, сможешь ли ты решить эту проблему. Кажется, что данные строки содержат миллисекунды, но ваш выбор не возвращает их.

После того, как вы это сделаете, но проблема останется, мы увидим, каким будет следующий шаг.

0 голосов
/ 23 октября 2009
where foo.SignupDate >= signUpDate
  && foo.SignUpDate < signUpDate.AddSeconds(1)
  && foo.LastActivityDate >= lastActivityDate 
  && foo.LastActivityDate < lastActivityDate.AddSeconds(1)
  && foo.LastLoginDate >= lastActivityDate 
  && foo.LastLoginDate < lastActivityDate.AddSeconds(1)
...