Вопрос

Хорошо, я использую 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();
Это было полезно?

Решение

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

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

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

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

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

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

Другие советы

Проверьте В этом посте объясняется, что нам нужно следить за столбцами DateTime, проверять различные типы данных между базой данных и вашей базой данных, и, наконец, объясняется оптимистический параллельный подход LinQ.

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)

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

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

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

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

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top