1

Хорошо, я использую SQL Server Express 2008 и .Net 3.5 (C#)Вопрос Linq-To-Sql с датой?

У меня есть пара полей 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) 

Каковы мои варианты в пути, чтобы получить Arround это?

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

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(); 

ответ

4

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

System.Data.Linq.ChangeConflictException: Row not found or changed

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

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

Это решило проблему, но чувствует себя немного как взломать ,

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

+0

Вы не должны чувствовать, что это взломать. Каждый пользователь идентифицируется по его/ее значению. Почему вы должны заботиться о LastActivityDate, который будет несколько изменяться в предложении WHERE? – liggett78

+0

Принципиально для оптимистической блокировки. Это позволяет нам проверить, что объект не изменился с тех пор, как мы его получили. – LiamB

0
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) 
+0

Я не пишу SQL сам его сгенерированный Linq к SQL – LiamB

+0

Вышеперечисленное _is_ a linq to sql where clause. – KristoferA

+0

См. Редактирование на мой основной пост, как я сказал, изначально, я не генерировал SQL im, используя объект сгенерированный LINQ. – LiamB

0

С той лишь разницей, в вашем примере миллисекунды, то я хотел бы использовать SQL Profiler, чтобы определить, если исходные Выберите возвратных миллисекунд. Затем посмотрите, можете ли вы исправить эту проблему. Кажется, что данные строки содержат миллисекунды, но ваш выбор не возвращает их.

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

+0

Просто добавьте actall, который возвращается из LINQ - объект DateTime фактически содержит значение миллисекунды. Но это значение не добавлено в запрос LINQ? – LiamB

+0

Я считаю, что это ограничение LINQ. Можете ли вы добавить в таблицу поле TIMESTAMP? – Gary

1

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

0

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

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

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

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

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

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