2009-03-27 4 views
4

У меня есть sql-запрос для моего SelectCommand на моем SqlDataSource. Это выглядит следующим образом:Могу ли я получить запрос, который был выполнен из SqlDataSource?

SELECT * FROM Books WHERE BookID = @BookID 

TextBox подает параметр @BookID с помощью Asp: ControlParameter.

Когда я осматриваю SelectCommand при пошаговом через код, я вижу это:

SELECT * FROM Books WHERE BookID = @BookID 

То, что я хочу на самом деле видим, что если типы человек в 3 в TextBox, я хочу видеть

SELECT * FROM Books WHERE BookID = 3 

Не могу понять, как получить доступ к вышеуказанному, хотя?

+0

Если SqlDataSource стоит что-либо на все это будет проходить ваше значение текстового окна в качестве параметра @BookId чтобы избежать атак SQL-инъекций. Как утверждает irperez, SQL Profiler является инструментом для этой работы. – TGnat

ответ

4

Одним из способов просмотра фактического запроса является использование SQL Profiler.

+1

Так что нет способа фактически просмотреть его в коде. – Xaisoft

+0

SQL Profiler по-прежнему будет отображать запрос и параметр рядом друг с другом, вы не увидите полный подробный запрос – cjk

+0

Я прошу отличаться. Я использовал Profiler, чтобы видеть, какие запросы передавались, чтобы увидеть, что происходит, и это выплевывало подробный запрос. – irperez

0

Я думаю, вы не сможете увидеть инструкцию выбора, как хотите, поскольку параметр не заменен в инструкции значением 3, но отправлен так же, как вы написали его на сервер sql (с параметром) ,

Это действительно хорошо, так как это предотвратит возможность ввода некоторого вредоносного кода sql в текстовое поле.

Во всяком случае, вы не можете получить значение переданного параметра с помощью этого:

cmd.Parameters(0).Value

где ЦМД ваш SqlCommand?

2

Запрос никогда не выполняется, как

SELECT * FROM Books WHERE BookID = 3 

Это фактически параметризируются запрос с параметром передается.

Вы можете выполнить «Найти/заменить» в запросе соответствующими параметрами, чтобы увидеть, как он будет выглядеть.

2

(Этот ответ предполагает, с реализацией SqlClient.)

Нет, вы не можете увидеть исполняемый код SQL. Класс SqlCommand вызывает sp_execute (см. Методы SqlCommand.BuildExecute для точной реализации), который отделяет запрос от параметров. Вам нужно будет использовать Sql Profiler для просмотра точного запроса.

Вы можете использовать предоставленный DbCommand (из события Selecting) для анализа вашего 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

Это 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 
Смежные вопросы