2009-04-19 18 views
18

Ist es möglich, über ADO.NET auf die SQL Server- "Nebenproduktnachrichten" zuzugreifen? Aufgrund des Fehlens von Wörtern verstehe ich unter "Nebenproduktnachrichten" die Ausgabe, die auf der Registerkarte Nachrichten in Microsoft SQL Server Management Studio angezeigt wird. Was mir besonders wichtig ist, ist die Ausgabe von SET STATISTICS TIME ON zu lesen. Es scheint, dass SqlDataReader in dieser Angelegenheit nichts bietet.Zugriff auf SQL Server-Nachrichten über ADO.NET

Antwort

24

Ja, es ist ein Ereignis auf der SqlConnection Klasse namens SqlInfoMessage, die Sie in einhaken können:

SqlConnection _con = 
    new SqlConnection("server=.;database=Northwind;integrated Security=SSPI;"); 

_con.InfoMessage += new SqlInfoMessageEventHandler(InfoMessageHandler); 

Der Event-Handler wird wie folgt aussehen:

static void InfoMessageHandler(object sender, SqlInfoMessageEventArgs e) 
{ 
    string myMsg = e.Message;    
} 

Die e.Message ist die Nachricht gedruckt aus dem Nachrichtenfenster in SQL Server Management Studio.

+1

+1 für diese. In ADO (OnInfoMessage) ist es seit über einem Jahrzehnt unter meiner Nase; Ich habe nie gewusst, was es war. –

2

Vielen Dank für die Antwort oben. Ich habe gerade ein kleines Experiment gemacht und einen kleinen unerwarteten Fehler (einen Fehler?) Gefunden, als ich Nachrichten (in diesem Fall von SET STATISTICS TIME ON) aus einem Multi-Recordset-Ergebnis gelesen habe. Wie unten angegeben, muss man NextResult auch nach dem letzten Resultset aufrufen, um die letzte Nachricht zu erhalten. Dies ist bei einem einzelnen Recordset-Ergebnis nicht erforderlich.

using System; 
using System.Data.SqlClient; 

namespace TimingTest 
{ 
    class Program 
    { 

     static void Main(string[] args) 
     { 

      SqlConnection conn = new SqlConnection("some_conn_str"); 
      conn.Open(); 

      conn.InfoMessage += new SqlInfoMessageEventHandler(Message); 

      SqlCommand cmd = new SqlCommand("some_sp", conn); 
      cmd.CommandType = System.Data.CommandType.StoredProcedure; 

      SqlDataReader rdr = cmd.ExecuteReader(); 

      while (rdr.Read()) { }; 

      rdr.NextResult(); 

      while (rdr.Read()) { }; 

      // this is needed to print the second message 
      rdr.NextResult(); 

      rdr.Close(); 

      conn.Close(); 

     } 

     static void Message(object sender, SqlInfoMessageEventArgs e) 
     { 
      Console.Out.WriteLine(e.Message); 
     } 

    } 
} 
+0

Dies wäre als Antwort auf eine separate Frage, z. "Wie bekomme ich die letzte Info-Nachricht nach dem Ausführen einer Abfrage, die mehrere Ergebnissätze zurückgibt?" oder etwas ähnliches. –

+0

Als ein Kommentar auf den Code für alle nicht bewusst, die leere While-Schleifen kann auch geschrieben werden: 'while (rdr.Read());' –

Verwandte Themen