![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Перехват ошибки в хранимой процедуре при добавлении строки [D6, MSSQL]
DrAndrey © (2005-09-19 05:22:00)Приложение отсылает на сервер команду на выполнение ХП назовем ее ХП_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 14:05:00) [1]
> Если не жалко бросьте на мыло несколько красивых ХП на которых
> можно поучиться.
Жалко у пчелки :)
http://www.sql.ru/forum/actualtopics.aspx?search=create+procedure&bid=1
Ega23 (2005-09-19 13:42:00) [2]несколько красивых ХП на которых можно поучиться.
Что конкретно тебя интересует?
DrAndrey (2005-09-19 13:19:00) [3]Всем спасибо. Почитаю в BOL об XACT_ABORT.
Проблема, честно говоря надуманная, нарушение ограничения моделировал искуственно при тестировании ХП, а на клиенте конечно есть проверка.
PS
Если не жалко бросьте на мыло несколько красивых ХП на которых можно поучиться.
Ega23 (2005-09-19 11:52:00) [4]Да, в Юконе обещали try ... catch добавить.
Иногда действительно СИЛЬНО нехватает...
Nikolay M. (2005-09-19 11:42:00) [5]
> ANB © (19.09.05 10:26) [2]
Во-первых, автор вместе с RAISERROR делает RETURN и выходит из ХП, хотя к вопросу это не имеет никакого отношения.
Во-вторых, гарантия прерывания ХП зависит от опции SET XACT_ABORT(пусть автор сам думает над тем, как организовать логику работы ХП в зависимости от ее значения), подозреваю, что у автора она имеет значение OFF. Но опять же к теме это не имеет отношения, т.к. в любом случае при нарушении СЦ вывалится ошибка, которую получит клиент (был неправ в [1]), так что либо менять логику клиентского приложения, либо проверять СЦ до инсерта.
Еще как вариант: если хочется русских сообщений об ошибке - перевести таблицу master..sysmessages.
ANB (2005-09-19 10:26:00) [6]Или перейти на оракл, там уже давно есть обработка исключений.
По сабжу - вызов ошибки и появление сообщения о ней - еще не гарантия прерывания выполнения хранимки. Есть еще понятие серьезности. У меня нет BOL, ща мастера проснутся - разжуют.
Nikolay M. (2005-09-19 09:50:00) [7]Если я правильно понял полет мысли, то не делать в ХП2
RAISERROR(@S, 16, 1)
? Или подождать MS SQL 2005, в котором есть обработка исключений вроде дельфевого try..except.