![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Обработка в приложении исключения, вызываемого в триггере. [D6, XP]
DROWSY © (2010-05-13 05:15:00)Как в можно проге перехватить, например, такое исключение в триггере
CREATE EXCEPTION NO_DELETE 'Нельзя удалять строку, нужную другой таблице';
CREATE TRIGGER SCRN_SURF_FORM_BD0 FOR SCRN_SURF_FORM
ACTIVE BEFORE DELETE POSITION 0
AS
begin
if (exists(select scrn_surf_form_code from screen where scrn_surf_form_code = old.code )) then
exception no_delete;
end
DROWSY (2010-05-19 22:48:00) [1]Для мастеров это, конечно ламерские наблюдения, но таким "мученикам", как я,
может будет интересно.
На таблицах Main и Depend, связанных по foreign key
построены
ibMain, ibDepend : TIBDataSet;
upMain, upDepend : TIBUpdateSQL;
Что я "наковырял":
при удалении записи в ibMain, если есть зависимые записи:
1)
если ibMain.CachedUpdates := true, то
если обновление через upMain (ibMain.UpdateObject := upMain), то Database.ApplyUpdates выыдаёт исключение
E: EIBClientError, E.IBErrorCode = 0 , E.SQLCode = 56 ("user abort")
если ibMain.CachedUpdates := true, то
если обновление без upMain (ibMain.UpdateObject := nil), то Database.ApplyUpdates выыдаёт исключение
E: EIBInterBaseError, E.SQLCode = -530 (ошибка на сервере, типа "bad foreign key"
2)
событие OnDeleteError для ibMain вызывается только если ibMain.CachedUpdates := false;
DROWSY (2010-05-17 16:38:00) [2]... кроме SQlCode = 100 и 101.
DROWSY (2010-05-17 16:34:00) [3]
> Сергей М. © (16.05.10 23:05) [9]
В документации к Firebird 1.5 все SQLCode отрицательные.
Сергей М. (2010-05-16 23:05:00) [4]
> Где есть "расшифровка" этих кодов?
>
В документацмм к соответствующей СУБД соответствующей версии.
DROWSY (2010-05-16 18:34:00) [5]Удалено модератором
DROWSY (2010-05-13 23:59:00) [6]try
Database.ApplyUpdates([DataSet as TIBCustomDataSet]);
Transaction.CommitRetaining;
{ Always call CancelUpdates to remove any discard changes }
CancelUpdates;
except
on E: EIBInterBaseError do begin
ShowMessage(Format('ErrCode: %d, SQLCode: %d ',
[E.IBErrorCode,E.SQLCode]));
Raise;
end;
on E: EIBInterBaseRoleError do begin
ShowMessage(Format('ErrCode: %d, SQLCode: %d ',
[E.IBErrorCode,E.SQLCode]));
Raise;
end;
on E: EIBClientError do begin
ShowMessage(Format('ErrCode: %d, SQLCode: %d ',
[E.IBErrorCode,E.SQLCode]));
Raise;
end;
on E: EIBError do begin
ShowMessage(Format('ErrCode: %d, SQLCode: %d ',
[E.IBErrorCode,E.SQLCode]));
Raise;
end;
on E: Exception do
begin
ShowMessage((PChar(E.Message + ' ' + IntToStr(E.HelpContext)) ,PChar('Change Data'));
Raise;
end;
end
Выдаёт:
ErrCode = 0
SQLCode = 56
Где есть "расшифровка" этих кодов?
Как добраться до исключения в триггере?
turbouser (2010-05-13 20:25:00) [7]
> DROWSY (13.05.10 19:36) [5]
на ibase.ru все есть
DROWSY (2010-05-13 19:36:00) [8]BDE не используется.
База FireBird 1.5., IBX
Вопрос в том, как (какой компонент) отловить исключение, вызванное в триггере.
Игорь Шевченко (2010-05-13 10:24:00) [9]
> Этот обработчик почему - то не вызывается.
Больно слышать
Leonid Troyanovsky (2010-05-13 10:03:00) [10]
> DROWSY (13.05.10 09:13) [2]
> Этот обработчик почему - то не вызывается.
Отсюда ж не видно, почему. Кроме того, у EDBEngineError есть Errors,
да и в партизанов играть недосук.
--
Regards, LVT.
DROWSY (2010-05-13 09:13:00) [11]Этот обработчик почему - то не вызывается.
При Database.ApplyUpdates генерируется исключение "User abort".
Leonid Troyanovsky (2010-05-13 08:55:00) [12]
> DROWSY (13.05.10 05:15)
> Как в можно проге перехватить, например, такое исключение
OnDeleteError?
--
Regards, LVT.