2009-03-27 11 views
4

SqlDataSourceでSelectCommandのsqlクエリがあります。次のようになります。SqlDataSourceから実行されたクエリを取得できますか?

SELECT * FROM Books WHERE BookID = @BookID 

TextBoxは、Asp:ControlParameterを使用して@BookIDパラメータを供給します。

私はでSelectCommandを表示すると、コードをステップ実行するとき、私はこれを参照してください。私は実際に見たいと思って何

SELECT * FROM Books WHERE BookID = @BookID 

するテキストボックスで3人のタイプならば、私は

を見たいということです
SELECT * FROM Books WHERE BookID = 3 

私は上記にアクセスする方法を理解できませんか?

+0

SQLインジェクション攻撃を回避するのに役立ちます。 irperezが以下に述べるように、SQLプロファイラはこの仕事のためのツールです。 – TGnat

答えて

4

実際のクエリを表示する1つの方法は、SQLプロファイラを使用することです。

+1

実際にコード内でそれを表示する方法はありません。 – Xaisoft

+0

SQLプロファイラは依然としてクエリとパラメータを横に並べて表示しますが、完全な詳細クエリは表示されません – cjk

+0

私は異なっています。 Profilerを使用して、何が行われているかを調べるためにどのクエリが渡されたかを確認し、詳細なクエリを吐き出しました。 – irperez

0

パラメータが値3のステートメントで置き換えられるのではなく、パラメータを使用してSQL Serverに書き込んだように、選択したステートメントを表示することはできません。 。

実際には、悪意のあるSQLコードをテキストボックスに挿入するのを防ぐため、実際にはうまくいきます。 cmdがあなたのSqlCommandオブジェクトである

cmd.Parameters(0).Value

はとにかく、あなたはこれを使用してパラメータに渡された値を取得することはできませんか?それは実際に渡されたパラメータを使用してパラメータ化クエリの

SELECT * FROM Books WHERE BookID = 3 

として

2

クエリが実行されることはありません。

関連するパラメータを使用してクエリに「検索/置換」を実行すると、どのように表示されるかを確認できます。

2

(この答えはSqlClientの実装で想定しています。)

いいえ、あなたが実行されたSQLコードを参照することはできません。 SqlCommandクラスは、クエリとパラメータを区切るsp_execute(正確な実装については両方のSqlCommand.BuildExecuteメソッドを参照)を呼び出します。実行された正確なクエリを表示するには、SQLプロファイラを使用する必要があります。

(Chooseイベントからの)提供されたDbCommandを使用してCommandTextを解析し、パラメータを実際の値に置き換えることができます。これは、エスケープのためのいくつかのロジックを必要とし、それはSql Serverが実行する正確なクエリではありません。

1
Public Function GenSQLCmd(ByVal InSqlCmd As String, ByVal p As Data.Common.DbParameterCollection) As String 
    For Each x As Data.Common.DbParameter In p 
     InSqlCmd = Replace(InSqlCmd, x.ParameterName, x.Value.ToString) 
    Next 
    Return InSqlCmd 
End Function 
0

これはアダムの答え

public string GenSQLCmd(string InSqlCmd, System.Data.Common.DbParameterCollection p) { 
    foreach (System.Data.Common.DbParameter x in p) { 
     InSqlCmd = InSqlCmd.Replace(x.ParameterName, "'" + x.Value.ToString() + "'"); 
    } 
    return InSqlCmd; 
} 

使用のC#バージョンである:SqlDataSourceコントロールが全く何の価値がある場合、それは@BookIdパラメータとして、あなたのテキストボックスの値を渡します

string DebugQuery = GenSQLCmd(cmd.CommandText, cmd.Parameters); //cmd is a SqlCommand instance 
関連する問題