Получение "окончательного" подготовленного заявления от MySqlCommand - PullRequest
3 голосов
/ 31 августа 2009

У меня есть следующая MySqlCommand:

Dim cmd As New MySqlCommand
cmd.CommandText = "REPLACE INTO `customer` VALUES( ?customerID, ?firstName, ?lastName)"

With cmd.Parameters
 .AddWithValue("?customerID", m_CustomerID)
 .AddWithValue("?firstName", m_FirstName)
 .AddWithValue("?lastName", m_LastName)
End With

У меня есть класс, который обрабатывает выполнение MySqlCommands, и я бы хотел, чтобы он записывал каждый запрос в файл. Я могу получить запрос / команду, которая выполняется с:

cmd.CommandText

, но это просто возвращает оригинальный CommandText с параметрами (? CustomerID,? FirstName и т. Д.), А не фактические замещенные значения, добавленные функциями AddWithValue . Как я могу узнать фактический «окончательный» запрос, который был выполнен?

Ответы [ 6 ]

3 голосов
/ 22 мая 2013

Я сделал следующее:

dim tmpstring as string = MySqlCommand.CommandText
For each p as MySqlParameter in MySqlCommand.parameters
    tmpstring = tmpstring.replace(p.ParameterName, p.Value)
Next

Это похоже на вывод всего, что вам нужно

1 голос
/ 17 сентября 2009

Параметризованный метод, который вы используете, должен подойти для предотвращения внедрения SQL.

.AddWithValue("?customerID", m_CustomerID)

Если m_CustomerID содержит текст

Haha I'm stealing your data; drop table whatever;

Тогда он не будет выполняться на сервере как таковой. AddWithValue разберется с вами.

Что касается фактически выполненного запроса, вы должны иметь возможность получить его из журнала запросов, если он включен.

1 голос
/ 31 августа 2009

Я не видел метод для этого.

И в любом случае подготовленные операторы отправляются на сервер с параметрами «customerID», «firstname», а затем фактические параметры отправляются отдельно - драйвер mysql не создает окончательный SQL-запрос, как вы это делаете если вы не использовали подготовленные заявления.

0 голосов
/ 12 февраля 2011

Если вы хотите самостоятельно регистрироваться в приложении .NET, лучше всего продолжать использовать класс MySqlCommand с параметрами, чтобы избежать внедрения SQL; однако, когда вы регистрируете CommandText, просматривайте коллекцию Parameters и регистрируйте каждую по имени / типу / значению.

0 голосов
/ 10 февраля 2011

У меня такая же потребность.

Из того, что я прочитал, текст запроса не объединяется со значениями параметров в клиенте - для этого они отправляются на сервер.

Чтобы проверить, какой запрос на самом деле отправлялся на сервер, я использовал протоколирование mysqld. Для моей версии MySQL я добавил эту запись в my.cnf:

log=queries.txt

Затем я смог ясно увидеть эффект объединения текста команды с параметрами: в моем случае после перезапуска mysqld я запустил свои модульные тесты, а затем открыл файл query.txt.

НТН!

0 голосов
/ 31 августа 2009

Вы должны построить его самостоятельно.

Параметры не просто выводятся в строку, а затем запускаются как оператор SQL. СУБД фактически подготовит SQL, а затем при необходимости будет использовать значения параметров. Следовательно, на сервер не отправляется ни один оператор SQL. Чтобы увидеть, каким будет SQL, вам нужно сделать:

Console.WriteLine("REPLACE INTO `customer` VALUES('" & m_CustomerID & _
    "', '" & m_FirstName & "', '" & m_LastName & "')")
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...