2009-04-19 36 views
18

Có thể truy cập vào SQL Server "thông báo sản phẩm phụ" thông qua ADO.NET không? Do thiếu từ, bởi "thông báo sản phẩm phụ", tôi có nghĩa là đầu ra xuất hiện trong tab Thông báo trong Microsoft SQL Server Management Studio. Những gì tôi đặc biệt có tâm trí là đọc đầu ra của SET STATISTICS TIME ON. Có vẻ như SqlDataReader không cung cấp bất cứ điều gì trong vấn đề này.Truy cập vào các tin nhắn SQL Server qua ADO.NET

Trả lời

24

Vâng, có một sự kiện trên lớp SqlConnection gọi SqlInfoMessage, mà bạn có thể móc vào:

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

_con.InfoMessage += new SqlInfoMessageEventHandler(InfoMessageHandler); 

Các xử lý sự kiện sẽ trông như thế này:

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

Các e.Message là thông điệp in ra cửa sổ thông báo trong SQL Server Management Studio.

+1

+1 cho điều này. Nó nằm dưới mũi của tôi trong ADO ('OnInfoMessage') trong hơn một thập kỷ; tôi chỉ không bao giờ đánh giá cao nó là gì. –

2

Cảm ơn bạn đã phản hồi ở trên. Tôi chỉ làm một thử nghiệm nhỏ và tìm thấy một chút trục trặc bất ngờ (một lỗi?) Khi đọc tin nhắn (trong trường hợp này được tạo ra bởi SET STATISTICS TIME ON) từ một kết quả multi-recordset. Như được chỉ ra dưới đây, người ta phải gọi NextResult ngay cả sau khi kết quả cuối cùng để nhận được tin nhắn cuối cùng. Điều này là không cần thiết trong trường hợp của một kết quả recordset duy nhất.

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

Điều này sẽ tuyệt vời như một câu trả lời cho một câu hỏi riêng biệt, ví dụ: "Làm cách nào để nhận được thông báo thông tin cuối cùng sau khi thực hiện truy vấn trả về nhiều bộ kết quả?" hoặc một cái gì đó tương tự. –

+0

Là một nhận xét về mã cho bất kỳ ai không biết, các vòng trống trong khi cũng có thể được viết như sau: 'while (rdr.Read());' –

Các vấn đề liên quan