2012-09-17 23 views
6

Tôi có chức năng kết nối db hiện có trong ứng dụng biểu mẫu web mà tôi muốn tích hợp với mini profiler. Tôi đã cài đặt và chạy hồ sơ nhỏ trên ứng dụng, nhưng tôi dường như không thể nhận được phần cơ sở dữ liệu được kết nối đúng cách. Dưới đây là một phần của mã chúng tôi kết nối với db với.Mini Profiler tích hợp với SqlConnection

public override IEnumerable<IDataRecord> Execute() 
{ 
    using(SqlConnection conn = new SqlConnection(ConnectionString)) { 
     using(SqlCommand command = new SqlCommand(CommandText, conn)) { 
      command.CommandType = SQLCommandType; 
      foreach(SqlParameter p in ParamsToAdd) { 
       command.Parameters.Add(p); 
      } 
      conn.Open(); 
      SqlDataReader rdr; 
      try { 
       rdr = command.ExecuteReader(); 
      } catch(Exception ex) { 
       //log error 
      } 
      using(rdr) { 
       while(rdr.Read()) { 
        yield return (IDataRecord)rdr; 
       } 
      } 
     } 
    } 
} 

tôi có thể dễ dàng đặt một bước xung quanh phương thức ExecuteReader() như sau:

using(MiniProfiler.Current.Step(command.CommandText)) { 
    rdr = command.ExecuteReader(); 
} 

nhưng điều này làm cho các hồ sơ nhỏ về hữu ích như dấu vết và tôi muốn để có được những truy vấn tính năng hiển thị trên trang web. Bất kỳ trợ giúp nào?

Trả lời

1

@aghilas câu trả lời đã được sử dụng một số thư viện khác nhưng đã enought để chỉ ra sai lầm của tôi mà tôi dường như không thể để tìm ra trước.

Tôi đã phải thay đổi từ việc sử dụng SqlConnection sang sử dụng DbConnection và tương tự cho SQLCommand => DbCommand và SQLDataReader => DbDataReader. Điều này cho phép ProfiledDbConnection kết nối đúng cách.

... 
using StackExchange.Profiling; 
using StackExchange.Profiling.Data; 
... 
using(DbConnection conn = new ProfiledDbConnection(new SqlConnection(ConnectionString), MiniProfiler.Current)) { 
     using(DbCommand command = conn.CreateCommand()) { 
      command.CommandText = CommandText; 
      command.Connection = conn; 
      command.CommandType = SQLCommandType; 
      foreach(SqlParameter p in ParamsToAdd) { 
       command.Parameters.Add(p); 
      } 
      conn.Open(); 
      DbDataReader rdr; 
      try { 
       rdr = command.ExecuteReader(); 
      } catch(Exception ex) { 
       //log error 
      } 
      using(rdr) { 
       while(rdr.Read()) { 
        yield return (IDataRecord)rdr; 
       } 
      } 
     } 
    } 
9

Bạn có thể thử với mã này - dựa trên ProfiledDbConnection lớp

var connection = MiniProfiler.Data.ProfiledDbConnection.Get(new SqlConnection(str)); 
var cmd = connection.CreateCommand(); 
var param = connection.CreateParameter(); 

Link: https://github.com/ServiceStack/ServiceStack/tree/master/src/ServiceStack/MiniProfiler/Data

+1

Cố gắng thực hiện công việc này nhưng tôi nhận được "miniprofiler không chứa định nghĩa cho dữ liệu" – ThunD3eR

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