Что делать в Delphi TDataSetProvider.OnUpdateError, если я просто хочу остановить выполнение и сообщить об ошибке? - PullRequest
0 голосов
/ 12 декабря 2018

У меня есть приложение Delphi с TIBQUery-TDataSetProvider-TClientDataSet, которое более или менее эмулирует шаблон CachedUpdates (который был в предыдущих компонентах BDE).В настоящее время нет кода обработки ошибок, поэтому сообщений об ошибках нет вообще.Я просто хочу включить следующий сценарий: когда в запросе возникает какая-либо ошибка, поступающая из базы данных, тогда все цепочки должны остановить работу, остаться на текущих значениях, откатить уже опубликованные изменения и показать сообщение.Я предполагаю - все это может быть сделано путем реализации TDataSetProvider.OnUpdateError.У меня есть 2 предложения кода.Первый:

procedure TBillDM.BillProvUpdateError(Sender: TObject;
  DataSet: TCustomClientDataSet; E: EUpdateError; UpdateKind: TUpdateKind;
  var Response: TResolverResponse);
begin
  inherited;
  raise E;
end;

Другой вариант:

procedure TBillDM.BillProvUpdateError(Sender: TObject;
  DataSet: TCustomClientDataSet; E: EUpdateError; UpdateKind: TUpdateKind;
  var Response: TResolverResponse);
begin
  inherited;
  Response:=rrAbort;
  BillQry.Transaction.RollbackRetaining;
  ShowMessage(E.Message);
end;

Являются ли эти шаблоны кода вполне нормальными?Каковы рекомендации для OnUpdateError, если вы просто хотите остановить выполнение и сообщить об ошибке?Я хочу, чтобы в приложении не было никакого интеллекта - я могу только предоставить более значимое сообщение об ошибке, но все исправления должны быть сделаны пользователем.

1 Ответ

0 голосов
/ 13 декабря 2018

Если вы хотите сделать ваше приложение многоуровневым, вы не захотите использовать ShowMessage в обработчиках событий провайдера.просто используйте cds.ApplyUpdates с 0 в качестве максимального количества ошибок и используйте обработчик события OnReconcileError.Вот выдержка из раздела справки «Applyuing updates»: «ApplyUpdates принимает один параметр, MaxErrors, который указывает максимальное количество ошибок, которые поставщик должен допустить до прерывания процесса обновления. Если MaxErrors равен 0, то, как только возникает ошибка обновления, весь процесс обновления завершен. В базу данных не записано никаких изменений, и журнал изменений набора данных клиента остается нетронутым ».Разве это не то, что вы ищете?

...