Druckausgabe der gespeicherten Prozedur in .NET erfassen


97

Ist es möglich, die Druckausgabe einer in .NET gespeicherten T-SQL-Prozedur zu erfassen?

Ich habe viele ältere Prozesse, die den Druck als Mittel zur Fehlermeldung verwenden. Ist es beispielsweise möglich, über das folgende PROC auf das Outprint-Wort zuzugreifen?

-- 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
Es geht vielleicht nicht nur um Fehler. Ich werde versuchen, dies zu verwenden, um den Fortschritt eines lang laufenden gespeicherten Prozesses zu verfolgen, indem ich die informative Ausgabe beobachte.
Csaba Toth

Antworten:


143

Sie können dies tun, indem Sie dem InfoMessage- Ereignis in der Verbindung einen Ereignishandler hinzufügen .

myConnection.InfoMessage += new SqlInfoMessageEventHandler(myConnection_InfoMessage);

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

5
Wenn Sie auch möchten, dass die betroffenen Zeilen zählen, benötigen Sie einen Handler für das StatementCompleted-Ereignis im SqlCommand.
Nicholas

@Nicholas kannst du das näher erläutern? Ich kann dieses Ereignis nicht richtig zum Laufen bringen. Bitte sehen Sie stackoverflow.com/questions/27993049/…
Herr TA

Erfassen Sie alle Nachrichten, die mit diesem Ereignis auf einem SQL Server erstellt wurden? Ist es möglich, dass dieses Ereignis auch einige andere Nachrichten abfängt, die nicht von dieser gespeicherten Prozedur erzeugt wurden?
FrenkyB

Dies mag offensichtlich sein, aber wenn keine Ausgabe vom Prozess erfolgt (kein Drucken, Erhöhen usw.), wird das Ereignis nicht ausgelöst. Das hat mich eine Weile verblüfft, bis mir klar wurde, was los war.
IronRod

@FrenkyB Ich kann bestätigen, dass alle Ausgaben (Drucken, Erhöhen usw.) des aufgerufenen Prozesses oder aller von ihm aufgerufenen Prozesse oder Funktionen erfasst werden.
IronRod

9

Dies ist sehr praktisch, wenn Sie die Druckausgabe in der Ausgabekonsole von LinqPad erfassen möchten:

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

1

So erhalten Sie die Ausgabe in eine Variable:

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);
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.