Обработка ошибок обновления в нескольких записях в методе ReconcileError в TClientDataset
Я пытаюсь использовать событие ReconcileError, чтобы позволить пользователю исправить данные после ошибки обновления, которая произошла в определенной записи среди других.
Пример:
У меня есть набор данных с одним полем и 3 записями, это поле имеет уникальное ограничение для базы данных, затем я изменяю одно значение на конфликт, когда оно достигает базы данных, затем я вызываю ApplyUpdates для набора данных.
Это сгенерирует ошибку (нарушение ограничения уникальности) в поставщике и прервет процесс applyupdates, вернув raAbort в переменную Action переменной ReconcileError.
В методе ReconcileError я попытался использовать:
Action := HandleReconcileError(aDataSet, UpdateKind, E);
** РЕДАКТИРОВАТЬ **
После отладки и выгрузки записей DataSet, которые были возвращены с сервера, я заметил, что в этом наборе данных есть 2 записи: первая - старая запись, а вторая - все изменения, которые я внес в первую запись.
Я немного запутался, всегда ли я получу этот DataSet с двумя записями? Я думал, что у него должна быть только одна запись со старыми / новыми значениями.
Благодарю.
3 ответа
После небольшой отладки и чтения я понял следующее:
- OnReconcileError вызывается для каждой записи, которую нельзя применить, и для каждой создается набор данных.
- Этот DataSet имеет 2 записи, когда UpdateKind имеет значение ukModify, одну запись как usUnModified (исходная запись) и вторую запись как usModified (все изменения находятся во второй записи)
- Когда изменение - ukInsert или ukDelete, DataSet имеет только одну запись
- Этот набор данных не следует изменять, так как это просто временный набор данных, созданный для того, чтобы вы могли читать данные
- Диалог согласования не работает должным образом, так как он никогда не показывает правильные значения измененной записи (ошибка Delphi 2010?)
В dbExpress вы найдете с компонентом TSQLConnection, в параметрах запись Mars_Connection, для которой по умолчанию установлено значение False, установите для этого параметра значение True, и сообщение об ошибке разрешится.
Запись, переданная OnReconcileError или OnUpdateError, является записью, к которой нельзя применить обновления. В соответствии с файлом справки D2007 (обратите внимание, что это ссылка на файл справки, а не веб-ссылка!) - обратите внимание на раздел, касающийся параметра DataSet:
Вы всегда должны кодировать обработчик события OnReconcileError или OnUpdateError, даже если только отбрасываете возвращенные записи, которые не могли быть применены. Обработчики событий для этих двух событий работают одинаково. Они включают в себя следующие параметры:
DataSet: набор данных клиента, который содержит обновленную запись, которая не может быть применена. Вы можете использовать методы этого набора данных, чтобы получить информацию о записи о проблеме и отредактировать запись, чтобы исправить любые проблемы. В частности, вы захотите использовать свойства CurValue, OldValue и NewValue полей в текущей записи, чтобы определить причину проблемы обновления. Однако вы не должны вызывать методы набора клиентских данных, которые изменяют текущую запись в вашем обработчике событий.