2009-04-19 12 views
18

SQL Server "yan ürün mesajlarına" ADO.NET üzerinden erişmek mümkün mü? Kelimelerin eksikliğinden dolayı, "yan ürün mesajları" ile Microsoft SQL Server Management Studio'daki Mesajlar sekmesinde görünen çıktıyı kastediyorum. Özellikle aklımda olan şey SET İSTATİSTİKLERİNİN TAMAMI çıkışını okumaktır. SqlDataReader'ın bu konuda hiçbir şey sunmadığı anlaşılıyor.ADO.NET üzerinden SQL Server mesajlarına erişim

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

_con.InfoMessage += new SqlInfoMessageEventHandler(InfoMessageHandler); 

olay işleyicisi gibi görünecektir:

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

e.Message baskılı mesajdır

cevap

24

Evet, içine kanca SqlInfoMessage denilen SqlConnection sınıf bir olay var SQL Server Management Studio'da mesaj penceresine dışarı.

+1

+1. On yıldan uzun bir süredir ADO ('OnInfoMessage') 'da burnumun altındaydı; Ne olduğunu hiç takdir etmedim. –

2

Yukarıdaki yanıt için teşekkür ederiz. Ben sadece küçük bir deney yaptım ve çok kayıtlı bir sonuçtan (bu durumda SET İSTATİSTİKLERİ TIME ON tarafından üretilen) mesajları okurken biraz beklenmedik bir aksaklık (bir hata) buldum. Aşağıda belirtildiği gibi, son mesajı almak için son sonuçtan sonra bile NextResult'u aramalıdır. Tek bir kayıt sonucu durumunda bu gerekli değildir. Bunun için

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

Bu, ayrı bir soruya cevap olarak harika olurdu, örn. "Birden çok sonuç kümesi döndüren bir sorguyu yürüttükten sonra son bilgi iletisini nasıl alabilirim?" Veya benzeri. –

+0

Bilinmeyen herkes için kod hakkında bir yorum olarak, boş döngüler de şu şekilde yazılabilir: '(rdr.Read());' –