2009-04-19 60 views
18

是否可以通過ADO.NET訪問SQL Server「副產品消息」?由於缺少單詞,「副產品消息」是指出現在Microsoft SQL Server Management Studio的消息選項卡中的輸出。我特別在意的是讀取SET STATISTICS TIME ON的輸出。看來SqlDataReader在這個問題上沒有提供任何東西。通過ADO.NET訪問SQL Server消息

回答

24

是的,有一個在SqlConnection類稱爲SqlInfoMessage,你可以掛接到事件:

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

_con.InfoMessage += new SqlInfoMessageEventHandler(InfoMessageHandler); 

事件處理程序看起來像這樣:

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

e.Message是打印的信息進入SQL Server Management Studio的消息窗口。

+1

+1。 ADO(`OnInfoMessage`)在我的鼻子下已經有十多年了;我從未讚賞它是什麼。 – 2012-02-03 20:57:44

2

非常感謝您的回覆。我剛剛做了一個小實驗,發現從多記錄集結果中讀取消息(在這種情況下,由SET STATISTICS TIME ON產生)時出現了一些意想不到的故障(一個bug?)。如下所示,即使在最後的結果集之後,也必須調用NextResult以獲得最後的消息。在單個記錄集結果的情況下這不是必需的。

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

這對於一個單獨問題的答案是很好的,例如「在執行返回多個結果集的查詢之後,如何獲取最後的信息消息?」或類似的東西。 – 2012-01-22 06:32:05