Pregunta

Tengo un procedimiento almacenado que da un error lo suficientemente amigable que quiero mostrar a los usuarios pero cuando lo llamo de .NET se trata dos veces. Cuando llamo el proc de SQL Server Management Studio que sólo sale una vez.

Esta es una versión disección del procedimiento almacenado:

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

Yo llamo a esto en algún código C # usando ExecuteNonQuery() de un objeto System.Data.SqlClient.SQLCommand luego coger un System.Data.SqlClient.SQLException pero el mensaje contiene

"Error: Encontrado cosas malas están sucediendo \ nError encontrado:.. Las cosas malas están sucediendo"

¿Alguien sabe una razón por la que sale dos veces?

Este es el servidor SQL 2008 y .NET 3.5

¿Fue útil?

Solución

Por favor comente el "@ErrorString PRINT;" declaración. Cuando SQL del motor emite un error, sería muestra todos los mensajes están disponibles en la pila de mensajes.

Motivo:

Trate de correr por debajo de complemento código.

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

motor SQL genera 3 mensajes;

1. 1st for PRINT @ErrorString;

2. 2nd for PRINT 'Stack overflow'

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

Otros consejos

Inmediatamente después de registrar He eliminado la declaración de impresión y resulta que las declaraciones de impresión se pasan a través como parte del mensaje de excepción.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top