Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

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 действительно возбуждается ?

Приведи фрагмент ХП..


Наверх

Титульная страница Поиск, карта сайта Написать письмо