При работе с удаленным модулем данных могут возникать различные ошибки. Одна группа ошибок связана с заданием значений, не удовлетворяющих заложенным в базе данных ограничениям. Например, в таблице Pers заложено ограничение на год рождения: 1917-2000. Так что если вы введете в какой-то из записей год рождения, выходящий за эти пределы, возникнет ошибка при попытке занести такую запись в базу данных (при щелчке на кнопке В базу данных). Это обычные ошибки, не связанные со спецификой приложений, работающих с многими клиентами. Но при параллельной работе нескольких клиентов с одной и той же таблицей базы данных могут возникать также ошибки иного рода.

Два клиента могут работать с одной и той же записью и по-разному исправлять в ней одно и то же поле. Если, как в приложении, рассмотренном в разд. 9.3.2, опознавание записи ведется только по ключевому неизменяемому полю (в компоненте DataSetProviderl свойство UpdateMode равно upWhereKeyOnly), это не вызовет ошибки. Просто в базу данных занесутся значения того клиента, который переслал их в базу последним. Но если опознание ведется, например, по всем полям, то такая ситуация будет расценена как ошибочная. В любом случае появится ошибка, если один клиент редактирует запись, а другой клиент в это время удалил эту запись из базы данных. Тогда в момент занесения первым клиентом своих изменений в базу данных запись просто не будет найдена, так как она уже удалена.

Если условия работы с базой данных таковы, что подобные ошибки возможны, необходимо принять меры для разрешения возможных конфликтов. Проще всего это делать в обработчике события OnReconcileError клиентского набора данных ClientDataSetl. Событие OnReconcileError наступает при необходимости принятия решения относительно записи, вызвавшей ошибку при обновлении базы данных. События OnReconcileError генерируются методом Reconcile, который, в свою очередь, вызывается методом Apply Updates, заносящим изменения в базу данных. Если обнаруживаются записи, вызывающие ошибки при занесении их в базу данных, то для каждой такой записи генерируется соответствующее событие.

Заголовок обработчика события OnReconcileError имеет вид:

procedure TForml.ClientDataSetlReconcileError(

DataSet: TCustomClientDataSet;
E: EReconcileError;
UpdateKind: TUpdateKind;
var Action: TReconcileAction);

Параметр DataSet - это тот клиентский набор данных, записи которого вызвали ошибку. Если в приложении имеются связанные друг с другом наборы данных и ошибка произошла во вспомогательном наборе данных, то DataSet указывает этот набор, хотя событие генерируется для головного набора данных. При обработке события можно использовать для разрешения конфликта такие свойства набора данных DataSet, как свойства полей New Value, OldValue, CurValue. Однако в обработчике событий нельзя изменять текущую запись DataSet, применяя методы навигации (Next, Prior и т.п.).

Параметр Е является указателем на объект типа EReconcileError. Он содержит информацию, которую можно использовать при обработке ошибки. Основные свойства объекта типа EReconcileError:


|Следующая страница ⇒

Приемы программирования в Delphi на основе VCL



Новости за месяц

  • Июнь
    2020
  • Пн
  • Вт
  • Ср
  • Чт
  • Пт
  • Сб
  • Вс
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31