Форум: "Базы";
Текущий архив: 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