Вопрос

У меня есть сохраненная процедура, которая дает достаточно дружескую ошибку, которую я хочу показать пользователям, но когда я называю его от .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 Но сообщение содержит

«Ошибка: обнаружено плохие вещи. Nerror найдено: плохие вещи происходят».

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

Это на SQL Server 2008 и .NET 3.5

Это было полезно?

Решение

Пожалуйста, прокомментируйте «Печать @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 Engine генерирует 3 сообщения;

1. 1st for PRINT @ErrorString;

2. 2nd for PRINT 'Stack overflow'

3. 3rd for RAISERROR(@ErrorString, 11 /*severity*/, 1 /*state*/);

Другие советы

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top