![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Exception в Firebird не ловится в Delphi - почему?
Guest001 © (2006-09-15 11:58:00)Здравствуйте!
Ситуация такая - есть в Fireberd exception my_except, который вызывается в случае определенной ошибки в процедуре. Есть TIBStoredProc в Delphi, которая запускает Firebird'овскую процедуру. Запуск TIBStoredProc завернут в try except end. Почему при возникновении exception в базе у меня программа даже не переходит в раздел except?
Johnmen (2006-09-16 22:24:00) [1]Открою небольшую тайну, даже и не тайну вовсе. ВСЕ запросы выполняются в рамках транзакции, даже SELECT. Независимо от типа СУБД.
Guest001 (2006-09-15 15:44:00) [2]Да, бл..., разобрался... Все дело в том, что для процедуры, выполняющей эти действия и основных запросов TIBQuery была установлена одна и та же TIBTransaction. И в момент Transaction.Rollback DataSet чистился, бл..., и в параметр процедуры передавалось бог знает что (причем без всяких ошибок(!)), потому exception на сервере и не возбуждался. Ну вот - теперь разобрался, что в Firebird, в отличие от Oracle транзакция действует даже на select... и если ей сделать Rollback, то DataSet чистеет как младенец.
Всем спасибо!
Desdechado (2006-09-15 15:35:00) [3]а в отладчике что?
Guest001 (2006-09-15 15:21:00) [4]Вот текст процедуры
create or alter procedure kp_del_house
(
p_house_code integer
) as
declare v_cnt integer;
begin
-- êîëè÷åñòâî ÷åëîâåê, ïðîæèâàþùèõ â äîìå
select
count(*)
from
kp_flat_people p,
kp_flat f,
kp_house h
where
p.flat_code = f.code
and f.house_code = h.code
and h.code = :p_house_code
into
v_cnt;
-- åñëè êòî-òî ïðîæèâàåò/ïðîæèâàë, òî ÎØÈÁÊÀ
if (v_cnt > 0) then
exception kp_exc_house_not_deleted;
-- èùåì âëàäåëüöåâ êâàðòèð â äîìå
select
count(*)
from
kp_flat_owner o,
kp_flat f,
kp_house h
where
o.flat_code = f.code
and f.house_code = h.code
and h.code = :p_house_code
into
v_cnt;
-- åñëè âëàäåëüöû îáíàðóæåíû, òî ÎØÈÁÊÀ
if (v_cnt > 0) then
exception kp_exc_house_not_deleted1;
-- óäàëÿåì âñå êâàðòèðû â äîìå
delete
from
kp_flat
where
house_code = :p_house_code;
-- óäàëÿåì ñàì äîì
delete
from
kp_house
where
code = :p_house_code;
suspend;
end;
А вот кусок кода Delphi:
with ibspDelPeople do
try
// íà÷èíàåì íîâóþ òðàíçàêöèþ
if Transaction.InTransaction then
Transaction.Rollback;
Transaction.StartTransaction;
// èíèöèàëèçèðóå 236; ïàðàìåòðû
ParamByName('P_PEOPLE_CODE').AsInteger := qPeople.FieldByName('code').AsInteger;
// çàïóñêàåì ïðîöåäóðó
ExecProc;
// çàâåðøàåì òðàíçàêöèþ
Transaction.Commit
except
on E: Exception do
begin
Transaction.Rollback;
ErrorMsg('Îøèáêà ïðè óäàëåíèè: '+E.Message);
end;
end;
Guest001 (2006-09-15 15:17:00) [5]Да, при тесте из IBExpert этот exception видно прекрасно, плюс, если бы он не возбуждался, то обновлялась бы таблица, и изменения были бы видны... Сейчас выложу.
Сергей М. (2006-09-15 12:14:00) [6]А ты уверен, что my_except действительно возбуждается ?
Приведи фрагмент ХП..