2009-04-19 112 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