2009-04-19 10 views
18

ADO.NETを介してSQL Serverの「副産物メッセージ」にアクセスできますか?言葉がないため、「副産物メッセージ」とは、Microsoft SQL Server Management Studioの[メッセージ]タブに表示される出力を意味します。私が特に気にしているのは、SET STATISTICS TIME ONの出力を読むことです。 SqlDataReaderはこの点について何も提供していないようです。ADO.NETを介したSQL Serverメッセージへのアクセス

答えて

24

はい、あなたはにフックすることができますSqlInfoMessage呼ばSqlConnectionクラス上のイベントがあります:

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)の私の鼻の下に10年以上ありました。私はちょうどそれが何であるか感謝しなかった。 –

2

上記のご返信ありがとうございます。私はちょっと実験をして、マルチレコードセットの結果からメッセージ(この場合は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); 
     } 

    } 
} 
+0

これは、別の質問への回答としては素晴らしいでしょう。 "複数の結果セットを返すクエリを実行した後に、最後の情報メッセージを取得するにはどうすればよいですか?"または同様のもの。 –

+0

誰も知らないコードのコメントとして、空のwhileループは次のように書くこともできます: 'while(rdr.Read());' –

関連する問題