2010-09-14 13 views
0

J'ai une procédure stockée qui donne une erreur suffisamment amicale que je veux montrer aux utilisateurs, mais quand je l'appelle à partir de .net, il sort deux fois. Quand j'appelle le proc du studio de gestion de serveur de sql il sort seulement une fois.SqlException.Message dupliqué lors de l'appel sqlserver stocké proc

Voici une version dénudation de la procédure stockée:

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 

J'appelle cela 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

"Error: Found Bad things are happening.\nError Found: Bad things are happening."

Est-ce que quelqu'un sait une raison pour laquelle il sort deux fois?

Ceci est sur le serveur SQL Server 2008 et .NET 3.5

Répondre

0

Veuillez commenter le "PRINT @ErrorString;" déclaration. Lorsque SQL Engine génère une erreur, 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 

Le 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*/); 
0

Immédiatement après la publication, je 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.