Access to SQL Server messages via ADO.NET

后端 未结 3 1606
伪装坚强ぢ
伪装坚强ぢ 2020-12-10 10:59

Is it possible to access the SQL Server \"by-product messages\" via ADO.NET? Due to the lack of words, by \"by-product messages\" I mean the output which appears in the Mess

相关标签:
3条回答
  • 2020-12-10 11:13

    Based on marc_s' answer, I ve created a wrapper class

    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;
          }
     }
    

    Example of use :

        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} ";
        }
    
    0 讨论(0)
  • 2020-12-10 11:16

    Yes, there's an event on the SqlConnection class called SqlInfoMessage, which you can hook into:

    SqlConnection _con = 
       new SqlConnection("server=.;database=Northwind;integrated Security=SSPI;");
    
    _con.InfoMessage += new SqlInfoMessageEventHandler(InfoMessageHandler);
    

    The event handler will look like this:

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

    The e.Message is the message printed out to the message window in SQL Server Management Studio.

    0 讨论(0)
  • 2020-12-10 11:26

    Thank you for the response above. I just did a little experiment and found a little unexpected glitch (a bug?) when reading messages (in this case produced by SET STATISTICS TIME ON) from a multi-recordset result. As indicated below, one has to call NextResult even after the last resultset in order to get the last message. This is not needed in the case of a single recordset result.

    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 讨论(0)
提交回复
热议问题