2011-06-27 28 views
5

Tôi đang cố gắng sử dụng mvc-mini-profiler (tuyệt vời) với một số mã thủ tục lưu sẵn SqlConnection (chúng tôi không sử dụng EF hoặc L2S, chỉ ADO .NET đến SQL Server 2008). Tôi đang tìm một số hướng dẫn về cách tích hợp các loại ProfiledDb được kế thừa vào loại mã này.Sử dụng mvc-mini-profiler với ADO.NET SqlConnection

var con = new SqlConnection("connectionstring"); 
var cmd = new SqlCommand(); 
cmd.CommandType = CommandType.StoredProcedure; 
cmd.Connection = con; 
cmd.CommandText = "SP_STORED_PROCEDURE_NAME"; 
cmd.Paramters.Add("recordsetid",SqlDbType.UniqueIdentifier).Value = recordsetid; 
var dSet = new DataSet(); 
var da = new SqlDataAdapter(cmd); 
da.fill(dSet); 
<parse DataSet> 

Bất kỳ trợ giúp ở đây cho chúng ta sử dụng di sản ADO.NET sẽ là tuyệt vời vì trên bề mặt có vẻ là profiler SQL nên được áp dụng cho tình trạng này

+0

Dựa trên phản hồi của Sam bên dưới, tôi chỉ triển khai Dapper thay vào đó và lấy 50 dòng mã xuống khoảng 20 và giảm độ phức tạp đáng kể. Tôi đã có thể thực hiện một giải pháp cho SqlDataReaders bằng cách sử dụng 'DbDataReader' và' DbType.Guid' để thu thập tham số (thay thế tất cả các bit cụ thể của MS SQL bằng 'System.Data.Common' equivelant). Như Sam đã đề cập đến nó tiết hơn rất nhiều và bạn sẽ viết rất nhiều mã soạn sẵn và bạn có thể được phục vụ tốt hơn (imo) thực hiện Dapper hơn là cố gắng để shoehorn nó thành một SqlDataAdapter hiện tại – TodK

Trả lời

4

Bạn sẽ cần phải làm là thúc kết nối của bạn và sử dụng nhà máy DbConnection CreateCommand.

Tương tự để truyền tham số, bạn sẽ cần phải sử dụng các phương thức giao diện cơ sở và tránh các nội dung như SqlParameter vì nó không được bao bọc.

Vì vậy: DataSets

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

tôi đã không kiểm tra và DataAdapters, thành thật tôi sử dụng Dapper cho loại công cụ này những ngày này vì nó là ít hơn nhiều tiết. Nếu nó xuất hiện, hãy nhớ báo cáo trên mã Google.

+0

Dapper dễ dàng hơn tbh. Cảm ơn! – TodK

+0

Ngoài ra còn có một lớp 'ProfiledDbDataAdapter' bạn có thể sử dụng để bọc một' SqlDataAdapter' với lược tả. Xem http://stackoverflow.com/a/13793409/8479 – Rory

3

Tôi có một tình huống tương tự khi tất cả SQL của chúng tôi là trong các thủ tục được lưu trữ và chúng tôi chỉ đơn giản là có mã ADO.NET gọi vào chúng. Tôi cũng có một lớp truy cập dữ liệu mà tôi hài lòng vì vậy không thích ý tưởng phải viết lại các phần của nó đơn giản để chứa MiniProfiler.

Vì vậy, thỏa hiệp mà tôi đã giải quyết là sử dụng các cuộc gọi chuẩn MiniProfiler.Step() xung quanh các cuộc gọi thủ tục. Nó giúp trong trường hợp của tôi rằng tất cả các cuộc gọi đến ExecuteReader() et al là một phần của một lớp cơ sở vì vậy tôi biết tất cả các SqlCommands được thực thi trong một vài phương thức cơ bản, do đó, dễ dàng thay đổi mã hiện tại của tôi trông giống như sau:

protected SqlDataReader ExecuteReader() 
{ 
    SqlDataReader reader = null; 

    // sqlComm is a member of a base class which this method is part of. I also 
    // happen to know that sqlComm.CommandText will always refer to a stored 
    // procedure name so it makes it easy to view in the results. 
    using (MiniProfiler.Current.Step(sqlComm.CommandText)) 
    { 
     try 
     { 
      sqlConn.Open(); 
      reader = sqlComm.ExecuteReader(); 
     } 
     catch (SqlException exception) 
     { 
      sqlConn.Close(); 
      // Error handling removed for brevity... 
     } 
    } 

    return reader; 
} 

Tôi chắc rằng điều này không tốt bằng câu trả lời của Sam vì tôi chắc chắn một số chi tiết sẽ bị thiếu trong tab kết quả, nhưng nó hoạt động đủ tốt để tôi phân tích các cuộc gọi cơ sở dữ liệu ngay bây giờ với rất ít thay đổi đối với cấu trúc mã truy cập dữ liệu.

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