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

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

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

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

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 — удаление записей.

Параметр Action позволяет разработчику предусмотреть реакцию клиентского набора данных на ошибку:

type-

TReconcileAction = (raSkip, raAbort, raMerge, raCorrect, raCancel, raRefresh);

raSkip — отменить операцию для записей, вызвавших ошибку, с их сохранением в буфере;

raAbort — отменить все изменения для операции, вызвавшей ошибку;

raMerge — совместить измененные записи с аналогичными записями сервера;

racorrect — сохранить изменения, сделанные в данном методе-обработчике;

racancel — отменить изменения, вызвавшие ошибку, заменив их исходными локальными значениями клиентского набора данных;

raRefresh — отменить изменения, вызвавшие ошибку, заменив их исходными значениями серверного набора данных.

Как видите, выбор возможных реакций на ошибку сервера несколько шире, чем на локальные ошибки.

Тип ошибки возвращается параметром Е, для которого предусмотрен специальный класс EReconcileError, имеющий несколько полезных свойств.

Свойство

property ErrorCode: DBResult;

возвращает код ошибки. Используемые коды ошибок можно найти в файле \Source\Vcl\DSIntf.pas. Код предыдущей ошибки возвращается свойством property PreviousError: DBResult;

Рис. 22.4. Стандартный диалог обработки ошибок сервера

Используя представленную здесь информацию, вы можете самостоятельно управлять обработкой ошибок сервера на клиенте. Но можно поступить и более просто — использовать стандартный диалог обработки удаленных ошибок (рис. 22.4). Этот диалог можно подключить к вашему проекту (он содержится в модуле \ObjRepos\RecError.pas) и вызвать при помощи процедуры:

function HandleReconcileError(DataSet: TDataSet; UpdateKind: TUpdateKind; ReconcileError: EReconcileError): TReconcileAction;

В параметры этой функции подставляются параметры метода-обработчика OnReconciieError, а возвращает данная функция действие, выбранное пользователем в диалоге (см. рис. 22.4). Таким образом, ее использование очень просто:

procedure TForml.ClientDataSetReconcileError(DataSet: TCustomClientDataSet;

E: EReconcileError; UpdateKind: TUpdateKind; 

var Action: TReconcileAction); 

begin

Action := HandleReconcileError(DataSet, UpdateKind, E) ; end;

 


Знаете ли Вы, что в 1965 году два американца Пензиас (эмигрант из Германии) и Вильсон заявили, что они открыли излучение космоса. Через несколько лет им дали Нобелевскую премию, как-будто никто не знал работ Э. Регенера, измерившего температуру космического пространства с помощью запуска болометра в стратосферу в 1933 г.? Подробнее читайте в FAQ по эфирной физике.

НОВОСТИ ФОРУМА

Форум Рыцари теории эфира


Рыцари теории эфира
 10.11.2021 - 12:37: ПЕРСОНАЛИИ - Personalias -> WHO IS WHO - КТО ЕСТЬ КТО - Карим_Хайдаров.
10.11.2021 - 12:36: СОВЕСТЬ - Conscience -> РАСЧЕЛОВЕЧИВАНИЕ ЧЕЛОВЕКА. КОМУ ЭТО НАДО? - Карим_Хайдаров.
10.11.2021 - 12:36: ВОСПИТАНИЕ, ПРОСВЕЩЕНИЕ, ОБРАЗОВАНИЕ - Upbringing, Inlightening, Education -> Просвещение от д.м.н. Александра Алексеевича Редько - Карим_Хайдаров.
10.11.2021 - 12:35: ЭКОЛОГИЯ - Ecology -> Биологическая безопасность населения - Карим_Хайдаров.
10.11.2021 - 12:34: ВОЙНА, ПОЛИТИКА И НАУКА - War, Politics and Science -> Проблема государственного терроризма - Карим_Хайдаров.
10.11.2021 - 12:34: ВОЙНА, ПОЛИТИКА И НАУКА - War, Politics and Science -> ПРАВОСУДИЯ.НЕТ - Карим_Хайдаров.
10.11.2021 - 12:34: ВОСПИТАНИЕ, ПРОСВЕЩЕНИЕ, ОБРАЗОВАНИЕ - Upbringing, Inlightening, Education -> Просвещение от Вадима Глогера, США - Карим_Хайдаров.
10.11.2021 - 09:18: НОВЫЕ ТЕХНОЛОГИИ - New Technologies -> Волновая генетика Петра Гаряева, 5G-контроль и управление - Карим_Хайдаров.
10.11.2021 - 09:18: ЭКОЛОГИЯ - Ecology -> ЭКОЛОГИЯ ДЛЯ ВСЕХ - Карим_Хайдаров.
10.11.2021 - 09:16: ЭКОЛОГИЯ - Ecology -> ПРОБЛЕМЫ МЕДИЦИНЫ - Карим_Хайдаров.
10.11.2021 - 09:15: ВОСПИТАНИЕ, ПРОСВЕЩЕНИЕ, ОБРАЗОВАНИЕ - Upbringing, Inlightening, Education -> Просвещение от Екатерины Коваленко - Карим_Хайдаров.
10.11.2021 - 09:13: ВОСПИТАНИЕ, ПРОСВЕЩЕНИЕ, ОБРАЗОВАНИЕ - Upbringing, Inlightening, Education -> Просвещение от Вильгельма Варкентина - Карим_Хайдаров.
Bourabai Research - Технологии XXI века Bourabai Research Institution