2011-06-27 38 views
5

我試圖利用(真棒)MVC-迷你探查一些預先存在的SqlConnection存儲過程的代碼(我們不使用EF或L2S,只是ADO .NET到SQL Server 2008)。我正在尋找一些關於如何將繼承的ProfiledDb類型集成到這種類型的代碼中的指導。使用MVC-迷你探查與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> 

任何幫助,在這裏我們傳統ADO.NET的用戶將是巨大的,因爲在它看來,SQL事件探查器應適用於這種情況表面

+0

基於薩姆的反饋下面我只是實現了Dapper代替,把50行代碼下降到大約20和顯著降低了複雜性。我能夠通過使用'DbDataReader'和'DbType.Guid'來爲參數集合實現一個SqlDataReaders解決方案(用'System.Data.Common's equivelant替換所有的MS SQL特定位)。正如Sam提到的那樣,它更加冗長,最終你寫了很多樣板代碼,並且你可能會更好地服務(imo)實現Dapper,而不是試圖將其用於現有的SqlDataAdapter – TodK

回答

4

你需要做的是包裹起來的連接並使用DbConnection CreateCommand工廠。

同樣通過PARAMS您將需要使用底座接口的方法,並避免類似SqlParameter東西,因爲它不裹。

所以:

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

我沒有測試數據集和DataAdapters,老實說,我用小巧玲瓏的這種東西,這些天,因爲它是冗長的要少得多。如果它播放,一定要報告谷歌代碼。

+0

Dapper更容易tbh。謝謝! – TodK

+0

還有一個'ProfiledDbDataAdapter'類,您可以使用它來用分析來包裝'SqlDataAdapter'。請參閱http://stackoverflow.com/a/13793409/8479 – Rory

3

我也有類似的情況我們所有的SQL是在存儲過程中,我們只需在調用他們的ADO.NET代碼。我也有一個我很滿意的數據訪問層,因此不喜歡爲了適應MiniProfiler而重寫它的塊。

所以我決定就妥協是周圍使用過程調用標準MiniProfiler.Step()電話。在我的情況下,所有對ExecuteReader()等的調用都是基類的一部分,所以我知道所有的SqlCommands都可以在幾個基本方法中執行,所以很容易將現有代碼更改爲類似於以下代碼:

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

我敢肯定,這是不如薩姆的答案,因爲我敢肯定,一些細節會在結果選項卡丟失,但它的作品不夠好,我來分析數據庫,以非常小的變化,現在叫我數據訪問代碼結構。