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.