Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Базы";
Текущий архив: 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.48 MB
Время: 0.05 c
3-1158571057
memo
2006-09-18 13:17
2006.11.19
BLOB поле


2-1162436881
КарЭ
2006-11-02 06:08
2006.11.19
Combobox


2-1162267874
viper03
2006-10-31 07:11
2006.11.19
Как извлечь объект из ЛистБокса?


2-1162468879
bns
2006-11-02 15:01
2006.11.19
Record в class


2-1162287876
VitV
2006-10-31 12:44
2006.11.19
Fast Report перемещение бэндов





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский