SqlException.Message дублируется при вызове sqlserver хранимой процедуры - PullRequest
0 голосов
/ 14 сентября 2010

У меня есть хранимая процедура, которая дает достаточно дружественную ошибку, которую я хочу показать пользователям, но когда я вызываю ее из .net, она выходит дважды. Когда я вызываю proc из sql server management studio, он выходит только один раз.

Вот сокращенная версия сохраненного процесса:

ALTER PROC [Production].[spDoSomething] (
            @PassedID int)
AS
BEGIN
    DECLARE @ErrorString nvarchar(500);
    BEGIN TRY
        ...
        RAISERROR('Bad things are happening.', 11 /*severity*/, 1 /*state*/);
        ...
    END TRY
    BEGIN CATCH
        SET @ErrorString = 'Error found:' + ERROR_MESSAGE();
        PRINT @ErrorString;
        RAISERROR(@ErrorString, 11 /*severity*/, 1 /*state*/);
    END CATCH
END

Я вызываю это в некотором коде c #, используя ExecuteNonQuery() объекта System.Data.SqlClient.SQLCommand, затем ловлю System.Data.SqlClient.SQLException, но Сообщение содержит

«Ошибка: найдено. Плохое происходит. \ NОшибка найдено: происходит плохое».

Кто-нибудь знает причину, почему она выходит дважды?

Это на sql server 2008 и .net 3.5

Ответы [ 2 ]

0 голосов
/ 16 сентября 2010

Пожалуйста, прокомментируйте "PRINT @ErrorString;"заявление.Когда SQL Engine выдает ошибку, он отображает все сообщения, доступные в стеке сообщений.

Причина:

Попробуйте выполнить нижепривязанный код.

CREATE PROCEDURE ErrorHandler

AS
BEGIN
    -- SET NOCOUNT ON added to prevent extra result sets from
    -- interfering with SELECT statements.
    SET NOCOUNT ON;

   DECLARE @ErrorString nvarchar(500);
    BEGIN TRY
        RAISERROR('Bad things are happening.', 11 /*severity*/, 1 /*state*/);
    END TRY
    BEGIN CATCH
        SET @ErrorString = 'Error found:' + ERROR_MESSAGE();
        PRINT @ErrorString;
        PRINT 'Stack overflow'
        RAISERROR(@ErrorString, 11 /*severity*/, 1 /*state*/);
    END CATCH
END
GO

EXEC ErrorHandler

Механизм SQL генерирует 3 сообщения;

1. 1st for PRINT @ErrorString;

2. 2nd for PRINT 'Stack overflow'

3. 3rd for RAISERROR(@ErrorString, 11 /*severity*/, 1 /*state*/);
0 голосов
/ 14 сентября 2010

Сразу после публикации я удалил оператор печати, и оказалось, что операторы печати пропускаются как часть сообщения об исключении.

...