Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2006.11.19;
Скачать: CL | DM;

Вниз

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;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.029 c
3-1158172873
_Ламер_
2006-09-13 22:41
2006.11.19
TIBDataSet - последовательность действий.


15-1162493645
wl
2006-11-02 21:54
2006.11.19
термины


1-1159865750
Sham
2006-10-03 12:55
2006.11.19
Проблема с типами данных


15-1162396441
juice
2006-11-01 18:54
2006.11.19
Финансовые компоненты


2-1162415084
маэстро
2006-11-02 00:04
2006.11.19
подсветка DBGrid