try tMyTable.Post; except on E : EDBEngineError do if E.Message = 'Key violation' then begin MessageDlgC ('Дублирование записи не допускается.' mtError, [mbOk], 0); // Я не уверен в том, что это нужно делать: tMyTable.Cancel; end else Raise; end; |
Хорошим примером может служить проект DBERRORS.DPR, расположенный в каталоге Delphi 2 Demos. Выглядит это примерно так:
Создайте функцию типа этой:
function DBError(DataSet: TDataSet; E: EDatabaseError; var Action: TDataAction); const eKeyViol = 9729; var iDBIError: Integer; begin if (E is EDBEngineError) then begin iDBIError := (E as EDBEngineError).Errors[0].Errorcode; case iDBIError of eKeyViol: begin MessageDlg('Нарушение уникальности записи ', mtWarning, [mbOK], 0); Abort; end; end; |
Затем для каждой таблицы вашего приложения создайте следующий обработчик события:
procedure TMainForm.Table1EditError(DataSet: TDataSet; E: EDatabaseError; var Action: TDataAction); begin DBError(Table1, E, Action); end; |
Таким образом вы можете перехватить множество ошибок. Смотрите примеры от Borland, там много чего есть полезного. [001291]