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, там много чего есть полезного.
|