首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >通过ADO.NET访问SQL Server消息

通过ADO.NET访问SQL Server消息
EN

Stack Overflow用户
提问于 2009-04-19 09:45:27
回答 3查看 5K关注 0票数 23

是否可以通过ADO.NET访问SQL Server“副产品消息”?由于文字不足,我所说的“副产品消息”指的是出现在Microsoft SQL Server Management Studio的“消息”选项卡中的输出。我特别想到的是阅读SET STATISTICS TIME ON的输出。在这件事上,SqlDataReader似乎没有提供任何东西。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2009-04-19 09:48:52

是的,在SqlConnection类上有一个名为SqlInfoMessage的事件,您可以将其连接到:

代码语言:javascript
复制
SqlConnection _con = 
   new SqlConnection("server=.;database=Northwind;integrated Security=SSPI;");

_con.InfoMessage += new SqlInfoMessageEventHandler(InfoMessageHandler);

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

代码语言:javascript
复制
static void InfoMessageHandler(object sender, SqlInfoMessageEventArgs e)
{
    string myMsg = e.Message;            
}

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

票数 31
EN

Stack Overflow用户

发布于 2009-04-19 11:29:46

感谢你上面的回复。我刚刚做了一个小实验,发现了一个意想不到的小故障( bug?)从多记录集结果读取消息时(在本例中,通过将STATISTICS TIME设置为ON而生成)。如下所示,即使在最后一个结果集之后,也必须调用NextResult才能获得最后一条消息。如果是单个记录集结果,则不需要执行此操作。

代码语言:javascript
复制
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);
        }

    }
}
票数 4
EN

Stack Overflow用户

发布于 2018-11-30 19:52:57

基于marc_s' answer,我创建了一个包装器类。

代码语言:javascript
复制
public class SqlInfoMessageWrapper
{
     public SqlInfoMessageWrapper(SqlConnection connection)
     {
            SqlConnection = connection;
            connection.InfoMessage += new SqlInfoMessageEventHandler(InfoMessageHandler);
      }
      public SqlConnection SqlConnection { get; set; }
      public string Message  { get; set; }

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

使用示例:

代码语言:javascript
复制
    using (SqlConnection connection = new SqlConnection(connectionString))
    {
        connection.Open();
        var messageWrapper=new SqlInfoMessageWrapper(connection) ;

        var ret = SqlHelper2.ExecuteNonQuery(connection, CommandType.Text, command, null);
        messages+= $"{messageWrapper.Message} number of rows affected {ret} ";
    }
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/765142

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档