C#: Ausgabe der print-Meldungen von Stored Procedures

24. November 2010

Als Entwickler im Enterprise-Umfeld interagiert man täglich mit Datenbanken und führt über eine Datenzugriffsschicht in seiner .NET-Anwendung Stored Procedures aus.

Diese Trennung zwischen Programmlogik in C#/.NET und den Stored Procedures (T-SQL) bringt allerdings das ein oder andere Mal auch Nachteile mit sich. So steht man häufig vor der Herausforderung, dass man als Entwickler die Berechnungsschritte einer Stored Procedure nachvollziehen möchte bzw. diese in seiner Anwendung loggen möchte, was z.B. für Debugging-Zwecke sehr hilfreich sein kann.

Bei direkter Ausführung einer Stored Procedure auf dem DB-Server kann man Ausgaben über die print-Anweisung erzeugen, z.B. mit “print 'Dies stellt ein Zwischenergebnis dar'”. Diese Ausgabe lässt sich auch bei Verwendung einer SqlConnection in C# behandeln. Dafür existiert auf der SqlConnection das Event InfoMessage. Dieses wird immer dann ausgelöst, wenn eine print-Ausgabe bei der Ausführung einer SP erfolgt. Der zweite Parameter des Events hat den Typ SqlInfoMessageEventArgs und besitzt u.a. ein Property Message, über das sich die Nachricht abfangen und behandeln lässt:

   1: using(var conn = new SqlConnection(connString))

   2: using(var cmd = new SqlCommand(SP_NAME, conn))

   3: {

   4:     cmd.CommandType = CommandType.StoredProcedure;

   5:     conn.Open();

   6:     

   7:     // Event-Handler für print-Ausgaben registrieren

   8:     conn.InfoMessage += (s, msg) => Console.WriteLine(msg.Message);

   9:  

  10:     // SP ausführen und Ergebnisse verarbeiten

  11:     using(var reader = cmd.ExecuteReader())

  12:         // ...

  13:     

  14:     // ...

  15: }

So ist es auf einfache Art und Weise möglich Ausgaben bei Ausführung einer Stored Procedure in seiner .NET-Anwendung abzufangen und darauf reagieren zu können.