Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Как обрабатывать нужные исключения в ХП  [new]
Yadrinez
Member

Откуда: :адуктО
Сообщений: 360
Возник такой вопрос. В теле ХП происходит инсерт в целевую таблицу. Но перед этим входные параметры проверяются на определенные правила.
Так вот возник вопрос как передавать клиенту сообщение и код о том что какое то правило сработало.
Сделал сейчас через блок try except catch. Ниже код.
Мысль была в том чтобы перехватить и обработать свои исключения, передав их далее через выходные параметры, а системные исключения прокидывать на уровень вверх, чтобы они ловились уже на клиенте.
Людей знающих и опытных, в товарищах, кто подскажет как лучше сделать нет.
Надеюсь укажете на недостатки и предложите другие варианты.
Было бы интересно посмотреть коды ХП из рабочих проектов.
Код примерно получается такой в теле процедуры:

BEGIN TRY
.....
--Проверяем одно из правил 
IF @BranchId IS NULL BEGIN
  RAISERROR('Не указан филиал.',15,1) -- Генерируем свое исключение, с ERROR_NUMBER=50000
....
--Здесьб идет INSERT/UPDATE если все проверки завершились успешно
END TRY
BEGIN CATCH
  DECLARE 
    @ErrorMessage NVARCHAR(4000),
    @ErrorSeverity INT,
    @ErrorState INT;
  SET @ErrorMessage = ERROR_MESSAGE()
  SET @ErrorSeverity = ERROR_SEVERITY()
  SET @ErrorState = ERROR_STATE()
--Определяем что пользовательское исключение и передаем код и текст ошибки
--выходным параметрам ХП  @ResultCode,@ResultMessage
  IF ERROR_NUMBER()=50000   BEGIN
    SET @ResultCode=@ErrorState
    SET @ResultMessage=@ErrorMessage 
  END
--Если не свое исключение прокидываем его на уровень вверх, за пределы ХП, 
--для обработки клиентом
  ELSE 
    RAISERROR 
      (@ErrorMessage 
      ,@ErrorSeverity
      ,@ErrorState);
END CATCH
27 окт 09, 01:53    [7841655]     Ответить | Цитировать Сообщить модератору
 Re: Как обрабатывать нужные исключения в ХП  [new]
Yadrinez
Member

Откуда: :адуктО
Сообщений: 360
Извиняйте коде
IF @BranchId IS NULL BEGIN
  RAISERROR('Не указан филиал.',15,1) -- Генерируем свое исключение, с ERROR_NUMBER=50000

BEGIN лишний вставил
27 окт 09, 02:07    [7841670]     Ответить | Цитировать Сообщить модератору
 Re: Как обрабатывать нужные исключения в ХП  [new]
гость666
Guest
а может лучше на клиенте делать все проверки?
27 окт 09, 09:11    [7841981]     Ответить | Цитировать Сообщить модератору
 Re: Как обрабатывать нужные исключения в ХП  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31220
Yadrinez
Надеюсь укажете на недостатки и предложите другие варианты.
Вполне нормальный способ.

гость666
а может лучше на клиенте делать все проверки?
Проверки или обработку исключений?
Обработку ещё можно, хотя это далеко не всегда правильно, а делать все проверки на клиенте просто не получится - не зря же придумали всякие блокировки, атомарность, целостность и прочие приблуды СУБД.
27 окт 09, 09:26    [7842053]     Ответить | Цитировать Сообщить модератору
 Re: Как обрабатывать нужные исключения в ХП  [new]
Yadrinez
Member

Откуда: :адуктО
Сообщений: 360
Сперва делал все проверки на клиенте. Клиент толстый на DELPHI. Но тут в перспективе предполагается что еще будет тонкий клиент, потом еще дополнительные сервисы которые смогут использовать ХП.
Поэтому решил всю логику, которую возможно, перенести в ХП. А на клиентах оставить минимум
27 окт 09, 09:52    [7842173]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить