• Иллюстрированный самоучитель по Delphi 7 для профессионалов

    Обработка ошибок

    Особенности использования компонента TClientDataSet распространяются также и на обработку ошибок. Ведь клиентский набор данных должен реагировать не только на ошибки, возникшие локально, но и на ошибки сохранения изменений на сервере.

    В первом случае разработчик может применить стандартные способы. Это использование блоков try..except или методов обработчиков, унаследованных от класса TDataSet:

    • property OnDeleteError: TDataSetErrorEvent; – вызывается при ошибках удаления записей;
    • property OnEditError: TDataSetErrorEvent; – вызывается при ошибках редактирования записей;
    • property OnPostError: TDataSetErrorEvent; – вызывается при ошибках локального сохранения записей.

    Все они используют процедурный тип:

    type
    TDataSetErrorEvent = procedure(DataSet: TDataSet;
    E: EDatabaseError;
    var Action: TDataAction) of object;
    

    Здесь, помимо параметров DataSet и Е, определяющих соответственно набор данных и тип ошибки, параметром Action можно задать вариант реакции на ошибку:

    type TDataAction = (daFail, daAbort, daRetry);
    

    Где:

    • daFail – прервать операцию и показать сообщение об ошибке;
    • daAbort – прервать операцию без сообщения об ошибке;
    • daRetry – повторить операцию

    Например, при возникновении ошибки редактирования набора данных код обработчика может выглядеть следующим образом:

    procedure TForml.ClientDataSetEditError(DataSet: TDataSet;
    E: EDatabaseError; var Action: TDataAction);
    begin
    if Not (DataSet.State in [dsEdit, dslnsert]) then
    begin
    DataSet.Edit; Action: = daRetry;
    end
    else Action: = daAbort;
    end;
    

    Здесь, если набор данных не находится в состоянии редактирования, это упущение исправляется и операция повторяется.

    Итак, с локальными ошибками все обстоит достаточно просто. А как клиентский набор данных "узнает" об ошибке на удаленном сервере? Очевидно, при помощи своего компонента-провайдера. Действительно, компонент TDataSetProvider не только возвращает клиенту несохраненные изменения в пакете Delta (см. выше), но и обеспечивает генерацию события, реакцией на которое является метод-обработчик:

    type
    TReconcileErrorEvent = procedure(DataSet: TCustomClientDataSet; E: EReconcileError;
    UpdateKind: TUpdateKind;
    var Action:
    TReconcileAction) of object;
    property OnReconcileError: TReconcileErrorEvent;
    

    Обратите внимание, что все параметры похожи на соответствующие параметры локальных обработчиков, но имеют собственные типы. Рассмотрим их.

    Параметр UpdateKind содержит указание на тип операции, вызвавшей ошибку на сервере:

    type
    TUpdateKind = (ukModify, uklnsert, ukDelete);
    

    Где:

    • ukModify – изменение данных;
    • uklnsert – добавление записей;
    • ukDelete – удаление записей.
    Если Вы заметили ошибку, выделите, пожалуйста, необходимый текст и нажмите CTRL + Enter, чтобы сообщить об этом редактору.