2011-06-27 2 views
5

既存のSqlConnectionストアドプロシージャコードで(素晴らしい)mvc-mini-profilerを利用しようとしています(EFまたはL2Sを使用せず、ADO .NETからSQL Server 2008へ)。私はこの種のコードに継承されたProfiledDb型をどのように統合するかに関するいくつかのガイダンスを探しています。ADO.NETのSqlConnectionでmvc-mini-profilerを使用する

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のためのソリューションを実装することができました(すべてのMS SQLの特定のビットを 'System.Data.Common' equivelantで置き換える)。サムが言及したように、それはもっと冗長であり、多くの定型コードを書くことになり、既存のSqlDataAdapterにそれを振り分けようとするよりも、Dapperを実装するほうが良いでしょう。 – TodK

答えて

4

に適用可能であるべきであることが表示されますあなたの接続を包むありますDbConnection CreateCommandファクトリを使用します。

同様に、パラメータを渡す場合は、基本インターフェイスメソッドを使用する必要があります。ラップされていないため、SqlParameterのようなものは避けてください。

ので:

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

私はそれがはるかに少ない冗長であると正直に私はこれらの日のもののこの種のDapperのを使用して、データセットとDataAdaptersをテストしていません。それが再生される場合は、必ずGoogleコードで報告してください。

+0

Dapperは簡単でした。ありがとう! – 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; 
} 

結果のタブにいくつかの詳細が表示されないことがわかっているので、これはSamの回答ほど良くはないとは思いますが、データベース呼び出しを分析するのに十分機能します。データアクセスコード構造。

関連する問題