Frage

Ich habe eine gespeicherte Prozedur, die einen freundlich genug Fehler gibt, dass ich die Benutzer angezeigt werden soll, aber wenn ich es aus .net rufen kommt es zweimal aus. Wenn ich die proc von SQL Server Management Studio nenne es nur einmal kommt.

Hier ist eine cutdown Version des gespeicherten proc:

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

Ich nenne dies in einigen c # -Code mit ExecuteNonQuery() eines System.Data.SqlClient.SQLCommand Objekt dann ertappe ich einen System.Data.SqlClient.SQLException aber die Nachricht enthält

"Fehler: Gefunden Bad Dinge geschehen \ nError Gefunden:.. Schlimme Dinge passieren"

Wer weiß, einen Grund, warum es kommt zweimal aus?

Dies ist auf SQL Server 2008 und .NET 3.5

War es hilfreich?

Lösung

Bitte kommentieren Sie die "PRINT @ErrorString;" Aussage. Wenn SQL Engine einen Fehler wirft, wäre es zeigt alle Meldungen sind im Meldungsstapel zur Verfügung.

Begründung:

Versuchen Sie unter Code-Snap auszuführen.

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 erzeugt 3-Nachrichten;

1. 1st for PRINT @ErrorString;

2. 2nd for PRINT 'Stack overflow'

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

Andere Tipps

Unmittelbar nach der Veröffentlichung löschte ich die print-Anweisung und es stellt sich heraus, dass die Druck Aussagen, die durch die Ausnahmemeldung als Teil übergeben bekommen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top