从MySqlCommand获取“最终”准备好的语句

时间:2009-08-30 22:10:11

标签: mysql vb.net prepared-statement

我有以下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

但是只返回带有参数(?customerID,?firstName等)的原始 CommandText ,而不是 AddWithValue 函数添加的实际替换值。如何找出已执行的实际“最终”查询?

6 个答案:

答案 0 :(得分:3)

我做了以下事情:

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

这似乎输出了你需要的一切

答案 1 :(得分:1)

我没有看到这种方法。

在任何情况下,使用?customerID,?firstname参数将准备好的语句发送到服务器,然后单独发送实际参数 - mysql驱动程序不像你那样构建最终的sql查询如果你没有使用准备好的陈述。

答案 2 :(得分:1)

您正在使用的参数化方法应该可以防止SQL注入。

.AddWithValue("?customerID", m_CustomerID)

如果m_CustomerID包含文本

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

然后它不会最终在服务器上执行。 AddWithValue为您排序。

对于实际执行的查询,您应该能够从查询日志中获取该查询,如果已启用。

答案 3 :(得分:0)

你必须自己构建它。

参数不只是填充到字符串中,然后作为SQL语句运行。 RDBMS实际上将准备SQL,然后根据需要使用参数值。因此,没有一个SQL语句进入服务器。要查看SQL是什么,您必须这样做:

Console.WriteLine("REPLACE INTO `customer` VALUES('" & m_CustomerID & _
    "', '" & m_FirstName & "', '" & m_LastName & "')")

答案 4 :(得分:0)

我有同样的需要。

根据我的阅读,查询文本未与客户端中的参数值结合 - 它们会被发送到服务器。

为了检查实际发送到服务器的查询,我使用了mysqld日志记录。对于我的MySQL版本,我将此条目添加到my.cnf:

log=queries.txt

然后,我能够清楚地看到命令文本与参数组合的效果:在我的情况下,重新启动mysqld后,我运行了单元测试,然后打开了queries.txt文件。

HTH!

答案 5 :(得分:0)

如果您想自己从.NET应用程序管理日志记录,最好的办法是继续使用带参数的MySqlCommand类来避免SQL注入;但是,当您记录CommandText时,循环遍历Parameters集合并按名称/类型/值记录每个。