Как извлечь выходное значение из хранимой процедуры, если выдается исключение? - PullRequest
1 голос
/ 28 октября 2011

В SqlServer Management Studio, когда я выполняю хранимую процедуру и она выдает исключение, она также возвращает выходные значения.

Я не могу понять, как получить эти значения из C # .NET - когда выбрасывается исключение, выполнение останавливаетсяи выходные значения не заполняются.

Ответы [ 3 ]

3 голосов
/ 28 октября 2011

Я почти уверен, что вы можете использовать RAISERROR - это возвращает указанную информацию в приложение. Заметьте, это может быть не идеальная практика; а также может быть слишком поздно для вас, если у вас нет контроля над хранимой процедурой для ее реализации.

1 голос
/ 31 октября 2011

Вы можете использовать методы SQLServer для извлечения данных об исключениях, если вы инкапсулируете свой запрос в блок try catch следующим образом:

BEGIN TRY
 --SQL Statements
END TRY

BEGIN CATCH
  --exception details

    SELECT ERROR_NUMBER()  
    SELECT ERROR_STATE()  
    SELECT ERROR_SEVERITY()  
    SELECT ERROR_LINE()  
    SELECT ERROR_PROCEDURE()  
    SELECT ERROR_MESSAGE()   

END CATCH

Если вы не запускаете блок try catch.SqlServer хранит ошибки в своих журналах, и вы можете прочитать их с помощью t-sql, используя:

EXEC sys.xp_readerrorlog 1
1 голос
/ 28 октября 2011

Если вы контролируете как хранимую процедуру, так и код, выполняющий хранимую процедуру, то другой альтернативой, которую мы широко используем, является использование параметра хранимой процедуры OUTPUT для возврата кодов ошибок вызывающей стороне (т. Е. @ErrorCode INT = 0 ВЫХОД).

На мой взгляд, это имеет несколько преимуществ по сравнению с ошибками:

1) Обработка исключений - очень дорогая операция в .net framework. Если все, что вам нужно, - это сообщить пользователю, что что-то не так с введенными ими данными или конфликт в базе данных, возвращение кода ошибки будет иметь гораздо меньшее влияние на производительность приложения и сервера, чем выбрасывание и ловля исключений.

2) Если ваша процедура сделала это достаточно далеко при обработке, вы можете заполнить другие параметры. Например, если вам нужно включить информацию о том, у какого пользователя заблокирована запись, вы можете включить эту информацию в другой выходной параметр и построить свое сообщение об ошибке в коде.

3) С помощью этого метода легче поддерживать интернационализацию или настройку сообщений, чем с помощью сообщений об ошибках, закодированных в хранимых процедурах.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...