Форум: "Базы";
Текущий архив: 2006.11.19;
Скачать: [xml.tar.bz2];
ВнизException в Firebird не ловится в Delphi - почему? Найти похожие ветки
← →
Guest001 (2006-09-15 11:58) [0]Здравствуйте!
Ситуация такая - есть в Fireberd exception my_except, который вызывается в случае определенной ошибки в процедуре. Есть TIBStoredProc в Delphi, которая запускает Firebird"овскую процедуру. Запуск TIBStoredProc завернут в try except end. Почему при возникновении exception в базе у меня программа даже не переходит в раздел except?
← →
Сергей М. © (2006-09-15 12:14) [1]А ты уверен, что my_except действительно возбуждается ?
Приведи фрагмент ХП..
← →
Guest001 (2006-09-15 15:17) [2]Да, при тесте из IBExpert этот exception видно прекрасно, плюс, если бы он не возбуждался, то обновлялась бы таблица, и изменения были бы видны... Сейчас выложу.
← →
Guest001 (2006-09-15 15:21) [3]Вот текст процедуры
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;
← →
Desdechado © (2006-09-15 15:35) [4]а в отладчике что?
← →
Guest001 (2006-09-15 15:44) [5]Да, бл..., разобрался... Все дело в том, что для процедуры, выполняющей эти действия и основных запросов TIBQuery была установлена одна и та же TIBTransaction. И в момент Transaction.Rollback DataSet чистился, бл..., и в параметр процедуры передавалось бог знает что (причем без всяких ошибок(!)), потому exception на сервере и не возбуждался. Ну вот - теперь разобрался, что в Firebird, в отличие от Oracle транзакция действует даже на select... и если ей сделать Rollback, то DataSet чистеет как младенец.
Всем спасибо!
← →
Johnmen © (2006-09-16 22:24) [6]Открою небольшую тайну, даже и не тайну вовсе. ВСЕ запросы выполняются в рамках транзакции, даже SELECT. Независимо от типа СУБД.
Страницы: 1 вся ветка
Форум: "Базы";
Текущий архив: 2006.11.19;
Скачать: [xml.tar.bz2];
Память: 0.47 MB
Время: 0.041 c