Cattura l'output di stampa delle stored procedure in .NET


97

È possibile acquisire l'output di stampa da una stored procedure T-SQL in .NET?

Ho molti processi legacy che utilizzano la stampa come mezzo di messaggistica di errore. Un esempio, è possibile accedere alla 'parola' outprint dal seguente PROC?

-- The PROC
CREATE PROC usp_PrintWord AS
    PRINT 'word'
// Some C# Code to would like to pull out 'word'
SqlCommand cmd = new SqlCommand("usp_printWord", TheConnection);
cmd.CommandType = CommandType.StoredProcedure;
// string ProcPrint = ???

4
Forse non si tratta solo di errori. Cercherò di usarlo per tenere traccia dei progressi di un processo memorizzato di lunga durata guardando l'output informativo.
Csaba Toth

Risposte:


143

È possibile farlo aggiungendo un gestore di eventi all'evento InfoMessage sulla connessione.

myConnection.InfoMessage += new SqlInfoMessageEventHandler(myConnection_InfoMessage);

void myConnection_InfoMessage(object sender, SqlInfoMessageEventArgs e)
{
    myStringBuilderDefinedAsClassVariable.AppendLine(e.Message);
}

5
Se si desidera anche il conteggio delle righe interessate, è necessario un gestore per l'evento StatementCompleted su SqlCommand.
Nicholas

@Nicholas puoi elaborare? Non riesco a far funzionare correttamente quell'evento. Si prega di consultare stackoverflow.com/questions/27993049/…
Mr. TA

Stai intercettando tutti i messaggi prodotti all'interno di sql server con quell'evento? È possibile che questo evento catturi anche altri messaggi, non prodotti da quella stored procedure?
FrenkyB

Questo può essere ovvio, ma se non c'è output da proc (nessuna stampa, raiseerror, ecc.), L'evento non viene attivato. Questo mi ha lasciato perplesso per un po 'fino a quando ho capito cosa stava succedendo.
IronRod

@FrenkyB posso confermare che catturerà tutto l'output (print, raiserror, ecc.) Dal proc invocato o da qualsiasi proc o funzione che chiama.
IronRod

9

Questo è davvero utile se vuoi catturare l'output di stampa nella console di output di LinqPad:

SqlConnection conn = new SqlConnection(ConnectionString);
//anonymous function to dump print statements to output console
conn.InfoMessage += (object obj, SqlInfoMessageEventArgs e)=>{
                e.Message.Dump();
            };

1

Per ottenere l'output in una variabile:

string printOutput = "";

using (var conn = new SqlConnection(...))
{
    // handle this event to receive the print output
    conn.InfoMessage += (object obj, SqlInfoMessageEventArgs e) => {
        printOutput += e.Message;
    };

    // execute command, etc.
}

Console.Write(printOutput);
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.