0

私は、C#コードから多くのストアドプロシージャ(SQL Server 2008 r2)を呼び出す他の誰かが書いたコードをデバッグしています。C#コードは次のようになります

SqlCommand sqlCommand = new SqlCommand(strSP, ConnectionOpen());
sqlCommand.CommandType = CommandType.StoredProcedure;
sqlCommand.CommandTimeout = intTimeOut;
//System.Data.SqlClient.SqlParameter[] prmSQL
if (prmSQL != null)
{
  while (i < prmSQL.Length)
  {
    sqlCommand.Parameters.Add(prmSQL[i]);
    i = i + 1;
  }
}

SqlDataReader sqlReader = sqlCommand.ExecuteReader();

ストアドプロシージャをデバッグするには、SQLManagementStudioが必要とする文字列が本当に必要です。これはexecsp_nameparam one、param two(文字列と日付に必要な場合は引用符付き)のようなものです。sqlコマンドオブジェクトは、一部のプロパティを介してこの文字列を提供しません。私が知っている唯一の方法は、SQLサーバーでSQLプロファイラーを実行し、文字列を取得することです。残念ながら、DBAは、プロファイラーの実行がパフォーマンスに影響を与えると言っているため、これを好みません。C#コードからsp exec文字列を取得するために使用するアドインまたはコードスニペットはありますか?この文字列を取得するための最良の方法は何ですか?ありがとう

4

3 に答える 3

1

担当者が低すぎて(StackOverflowにはまだ慣れていない)コメントできないので、これを回答として投稿します。謝罪いたします。ただし、 SMOを検討することを検討してください。SMOは、SQLServerとの対話に使用できる.NETオブジェクトモデルです。SMOを使用すると、特定のストアドプロシージャへの参照を取得し、そのパラメータ を列挙できます。

それはあなたが始めるのを助けるかもしれません。

于 2012-08-30T20:37:52.500 に答える
1

NuGetで利用可能なmvc-mini-profilerのようなツールを使用できます(注:名前は誤解を招く可能性があります。MVCに限定されません)。マイナーな説明-接続をラップするため、ではなく抽象を使用する必要があります。次に、接続を作成する1行のコード(おそらくどこかのユーティリティクラス)を微調整するだけです。つまり、次の代わりに:DbConnectionSqlConnection

var conn = new SqlConnection(someString);
return conn;

あなたが使うかもしれない:

var conn = new SqlConnection(someString);
return new StackExchange.Profiling.Data.ProfiledDbConnection(
            conn, MiniProfiler.Current);

それを有効にする方法は他にもいくつかありますが(すべてサイトページに表示されています)、 MVCアプリケーションに追加するには文字通り2分かかります。出力は、有効なユーザー(開発者など)のすべてのアクティビティをリアルタイムで監視することです。私たちはstackoverflow/stackexchangeで24時間365日使用しています(つまり、パフォーマンスに影響を与えないことを確認しました)。ライブデモはhttps://data.stackexchange.com/で入手できます。ログインするだけで、プロファイリングデータが左上に表示されます。SSMSから実行可能な形式でデータを自動的に表示します。これは、データを頻繁に使用するためです。つまり、パラメーターを変数の宣言/初期化であるかのように表示します。

また、LINQ-to-SQLやdapper-dot-net(および他の多くの)などのORMともうまく連携します。

于 2012-08-30T20:53:20.273 に答える
0

EXECコマンドを作成するには、プロシージャで使用されるパラメータ名を知っている必要があります。GetDbSchemaTableメソッドを使用してそれらを見つけることができると思いますが、whcihはストアドプロシージャSQLを取得します(これはMS-Access / OLEDBを使用して行い、MS-SQL / SqlClientでも同じように機能すると想定しています)。

using (conn == new OleDb.OleDbConnection(DBConnection)) {
    conn.Open();
    DataTable DBObject = conn.GetOleDbSchemaTable(OleDb.OleDbSchemaGuid.Procedures, null);
}    

「PROCEDURE_DEFINITION」という名前の列には、プロシージャのSQLと、できればパラメータリストが含まれています。

また、データベースからのスキーマ情報の取得も確認することをお勧めします。

HTH

于 2012-08-30T20:41:16.873 に答える