Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Базы";
Текущий архив: 2005.10.30;
Скачать: [xml.tar.bz2];

Вниз

Перехват ошибки в хранимой процедуре при добавлении строки   Найти похожие ветки 

 
DrAndrey ©   (2005-09-19 05:22) [0]

Приложение отсылает на сервер команду на выполнение ХП назовем ее ХП_1, которая в рамках транзакции вызывает другую (ХП_2)

try
ХП_1.ExecProc;

**** внутри ХП_1

DECLARE @Message VARCHAR(100), @ReturnStatus INT

BEGIN TRAN

EXECUTE @ReturnStatus= ХП2...

_ _ _ _ Внутри ХП_2

 проверка параметров, получение и анализ значений локальных переменных
 на основании которого - вставка 1-й строки в одну таблицу

 после INSERT проверка: IF @@ROWCOUNT<>1 OR @@ERROR<>0 RETURN 1

_ _ _ _

IF @ReturnStatus<>0 OR @@ERROR<>0 BEGIN
 ROLLBACK TRAN
 SET @Message= "Ошибка...."  
 RAISERROR(@S, 16, 1)
 RETURN 1
END

COMMIT TRAN
RETURN 0

****

Except on E: Exception do
MessageBox(Application.Handle, PChar(E.Message), PChar("..."), MB_OK or MB_ICONERROR );
end;

Если при вставке не соблюдается constraint, то ошибка передается сразу приложению
и выводится стандартное сообщение об ошибке класса EOleException.
Каким образом перехватить такую ошибку на сервере внутри ХП_2, обработать внутри ХП_1, а приложению
передать свое сообщение понятное для пользователя.

Как это сделать на клиенте я знаю, но хочется на сервере.


 
Nikolay M. ©   (2005-09-19 09:50) [1]

Если я правильно понял полет мысли, то не делать в ХП2
RAISERROR(@S, 16, 1)
? Или подождать MS SQL 2005, в котором есть обработка исключений вроде дельфевого try..except.


 
ANB ©   (2005-09-19 10:26) [2]

Или перейти на оракл, там уже давно есть обработка исключений.

По сабжу - вызов ошибки и появление сообщения о ней - еще не гарантия прерывания выполнения хранимки. Есть еще понятие серьезности. У меня нет BOL, ща мастера проснутся - разжуют.


 
Nikolay M. ©   (2005-09-19 11:42) [3]


> ANB ©   (19.09.05 10:26) [2]

Во-первых, автор вместе с RAISERROR делает RETURN и выходит из ХП, хотя к вопросу это не имеет никакого отношения.
Во-вторых, гарантия прерывания ХП зависит от опции SET XACT_ABORT (пусть автор сам думает над тем, как организовать логику работы ХП в зависимости от ее значения), подозреваю, что у автора она имеет значение OFF. Но опять же к теме это не имеет отношения, т.к. в любом случае при нарушении СЦ вывалится ошибка, которую получит клиент (был неправ в [1]), так что либо менять логику клиентского приложения, либо проверять СЦ до инсерта.
Еще как вариант: если хочется русских сообщений об ошибке - перевести таблицу master..sysmessages.


 
Ega23 ©   (2005-09-19 11:52) [4]

Да, в Юконе обещали try ... catch добавить.
Иногда действительно СИЛЬНО нехватает...


 
DrAndrey ©   (2005-09-19 13:19) [5]

Всем спасибо. Почитаю в BOL об XACT_ABORT.
Проблема, честно говоря надуманная,  нарушение ограничения моделировал искуственно при тестировании ХП, а на клиенте конечно есть проверка.

PS
Если не жалко бросьте на мыло несколько красивых ХП на которых можно поучиться.


 
Ega23 ©   (2005-09-19 13:42) [6]

несколько красивых ХП на которых можно поучиться.


Что конкретно тебя интересует?


 
Nikolay M. ©   (2005-09-19 14:05) [7]


> Если не жалко бросьте на мыло несколько красивых ХП на которых
> можно поучиться.

Жалко у пчелки :)
http://www.sql.ru/forum/actualtopics.aspx?search=create+procedure&bid=1



Страницы: 1 вся ветка

Форум: "Базы";
Текущий архив: 2005.10.30;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.46 MB
Время: 0.06 c
6-1120660294
Gold
2005-07-06 18:31
2005.10.30
IdPOP31.Retrieve - утечка памяти!! ??


1-1128579111
XfroSt
2005-10-06 10:11
2005.10.30
Ссылки на типы данных


14-1129120736
CHES
2005-10-12 16:38
2005.10.30
Помогите с переводом


2-1128164730
Yura32
2005-10-01 15:05
2005.10.30
Memo


14-1128718115
LordOfRock
2005-10-08 00:48
2005.10.30
Narod.Ru





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский