Плох тот Error, который не мечтает стать General'ом.
procedure TFDMUtils.GeneralError(DataSet: TDataSet; E: EDatabaseError; var
Action: TDataAction);
var
i: Word;
ExtInfo: string;
begin
ExtInfo := '';
if (E is EDBEngineError) thenbeginif (EDBEngineError(E).Errors[0].NativeError = 0) thenbegin// Local Errorif EDBEngineError(E).Errors[0].Errorcode = 9732 then
ExtInfo := DataSet.FieldByName(trim(copy(E.Message, 29,
20))).DisplayLabel;
.......................................
endelsebegin// Remote SQL Server error
ExtInfo := ExtractFieldLabels(DataSet, E.Message);
case EDBEngineError(E).Errors[0].NativeError of
233, 515:
Alert('Ошибка', 'Hе все поля заполнены ! ' + ExtInfo);
547:
if (StrPos(PChar(E.Message), PChar('DELETE')) <> nil) then
Alert('Ошибка пpи удалении',
'Имеются подчиненные записи, удаление (изменение) невозможно! ' +
ExtInfo)
elseif (StrPos(PChar(E.Message), PChar('INSERT')) <> nil) then
Alert('Ошибка пpи вставке', 'Отсутствует запись в МАСТЕР-таблице! '
+ ExtInfo)
elseif (StrPos(PChar(E.Message), PChar('UPDATE')) <> nil) then
Alert('Ошибка пpи обновлении',
'Отсутствует запись в МАСТЕР-таблице! ' + ExtInfo);
2601:
Alert('Ошибка', 'Такая запись уже есть!');
else
Alert('Ошибка', 'Hеизвестная ошибка, код - ' +
inttostr(EDBEngineError(E).Errors[0].NativeError) + ExtInfo);
end;
end;
end;
end;
Этот код был заточен под MSSQL, но не нужно пытаться его использовать, а лучше
по этому пpимеpу написать свою процедуру.
Статья Как поймать свой RAISEERROR в Delphi раздела Базы данных Ошибки БД может быть полезна для разработчиков на Delphi и FreePascal.
Комментарии и вопросы
Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.