SqlException.Message duplicato proc al momento della chiamata sqlserver conservato
-
02-10-2019 - |
Domanda
Ho una stored procedure che dà un errore abbastanza amichevole che voglio mostrare agli utenti, ma quando io lo chiamo da .net esce due volte. Quando chiamo il proc dallo studio di gestione del server SQL si tratta solo una volta.
Ecco una versione cutdown del proc memorizzato:
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
Io chiamo questo in qualche codice C # utilizzando ExecuteNonQuery()
di un oggetto System.Data.SqlClient.SQLCommand
poi prendo un System.Data.SqlClient.SQLException
ma il messaggio contiene
"Errore: Trovato cose brutte accadono \ nErrore Trovato:.. Le cose brutte accadono"
Qualcuno sa un motivo per cui esce due volte?
Questo è lo sql server 2008 e .NET 3.5
Soluzione
Si prega di commentare il "STAMPA @ErrorString;" dichiarazione. Quando SQL Engine genera un errore, sarebbe visualizza tutti i messaggi sono disponibili nella pila messaggio.
Motivo:
Prova a correre sotto SNAP codice.
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
motore SQL genera 3 messaggi;
1. 1st for PRINT @ErrorString;
2. 2nd for PRINT 'Stack overflow'
3. 3rd for RAISERROR(@ErrorString, 11 /*severity*/, 1 /*state*/);
Altri suggerimenti
Immediatamente dopo la pubblicazione ho cancellato la dichiarazione di stampa e si scopre che le dichiarazioni di stampa viene passato attraverso come parte del messaggio di eccezione.