SqlException.Message duplizieren, wenn SQL Server gespeicherte Prozedur aufrufen
-
02-10-2019 - |
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
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.