通过ADO.NET访问SQL Server消息

Jan*_*ich 22 sql-server ado.net

是否可以通过ADO.NET访问SQL Server"副产品消息"?由于缺少单词,"副产品消息"是指Microsoft SQL Server Management Studio的"消息"选项卡中显示的输出.我特别想到的是读取SET STATISTICS TIME ON的输出.看来SqlDataReader在这个问题上没有提供任何东西.

mar*_*c_s 28

是的,这个SqlConnection类上有一个叫做的事件SqlInfoMessage,您可以将其挂钩:

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

_con.InfoMessage += new SqlInfoMessageEventHandler(InfoMessageHandler);
Run Code Online (Sandbox Code Playgroud)

事件处理程序将如下所示:

static void InfoMessageHandler(object sender, SqlInfoMessageEventArgs e)
{
    string myMsg = e.Message;            
}
Run Code Online (Sandbox Code Playgroud)

e.Message是打印到SQL Server Management Studio中的消息窗口的消息.


Jan*_*ich 5

谢谢楼上的回复。我刚刚做了一个小实验,在从多记录集结果读取消息(在本例中由 SET STATISTICS TIME ON 生成)时发现了一些意外的故障(错误?)。如下所示,即使在最后一个结果集之后也必须调用 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);
        }

    }
}
Run Code Online (Sandbox Code Playgroud)