5

SqlDataSourceにSelectCommandのSQLクエリがあります。次のようになります。

SELECT * FROM Books WHERE BookID = @BookID

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

コードをステップ実行するときにSelectCommandを表示すると、次のように表示されます。

SELECT * FROM Books WHERE BookID = @BookID

私が実際に見たいのは、テキストボックスに3と入力すると、見たいということです。

SELECT * FROM Books WHERE BookID = 3

上記にアクセスする方法がわかりませんが?

4

7 に答える 7

4

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

于 2009-03-27T13:21:48.823 に答える
2

クエリは決して実行されません

SELECT * FROM Books WHERE BookID = 3

実際には、パラメーターが渡されたパラメーター化されたクエリです。

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

于 2009-03-27T13:33:01.137 に答える
2

(この回答は SqlClient 実装を前提としています。)

いいえ、実行された SQL コードは表示されません。SqlCommand クラスは、パラメーターからクエリを分離する sp_execute (正確な実装については、両方の SqlCommand.BuildExecute メソッドを参照) を呼び出します。実行された正確なクエリを確認するには、Sql Profiler を使用する必要があります。

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

于 2009-03-27T13:34:34.457 に答える
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
于 2009-05-17T06:20:14.377 に答える
0

パラメーターはステートメントで値3に置き換えられず、SQLサーバーに(パラメーターを使用して)書き込んだように送信されるため、selectステートメントを希望どおりに表示できないと思います。

たとえば、テキストボックスに悪意のあるSQLコードを挿入するのを防ぐことができるので、これは実際には良いことです.

とにかく、これを使用してパラメータに渡された値を取得できませんか:

cmd.Parameters(0).Value

cmd は SqlCommand ですか?

于 2009-03-27T13:27:15.957 に答える
0

これはアダムの答えのC#バージョンです

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

使用法:

string DebugQuery = GenSQLCmd(cmd.CommandText, cmd.Parameters); //cmd is a SqlCommand instance
于 2013-10-19T02:41:44.110 に答える