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

È stato utile?

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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top