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

Вниз

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

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

Наверх




Память: 0.48 MB
Время: 0.025 c
4-1125233954
Станислав
2005-08-28 16:59
2005.10.30
Фоновое окно


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


3-1125875699
ASVShade
2005-09-05 03:14
2005.10.30
Запрос не объединение таблиц


5-1107336978
khas
2005-02-02 12:36
2005.10.30
Добавление "детей" в DesignTime в свой компонент


3-1127203717
suharew
2005-09-20 12:08
2005.10.30
Индексы, поиск