Question

J'ai une procédure stockée qui donne une erreur assez sympathique que je veux montrer aux utilisateurs, mais quand je l'appelle de .net, il vient deux fois. Quand j'appelle le proc du studio de gestion de serveur sql il vient seulement une fois.

Voici une version dénudation du proc stocké:

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

Je l'appelle dans un code c # en utilisant ExecuteNonQuery() d'un objet System.Data.SqlClient.SQLCommand alors j'attraper un System.Data.SqlClient.SQLException mais le message contient

  

« Erreur: Trouvé mauvaises choses se produisent \ nErreur Trouvé:.. Les mauvaises choses se produisent »

Quelqu'un sait-il une raison pour laquelle il sort deux fois?

est sur le serveur SQL Server 2008 et .NET 3.5

Était-ce utile?

La solution

S'il vous plaît commenter la "IMPRIMER @ErrorString;" déclaration. Lorsque SQL Engine renvoie une erreur, il affiche tous les messages sont disponibles dans la pile de messages.

Raison:

Essayez d'exécuter du code ci-dessous pression.

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

moteur SQL génère 3 messages;

1. 1st for PRINT @ErrorString;

2. 2nd for PRINT 'Stack overflow'

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

Autres conseils

Immédiatement après la publication, j'ai supprimé la déclaration d'impression et il se trouve que les déclarations d'impression sont transmis à travers dans le cadre du message d'exception.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top