3

我有以下 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函数添加的实际替换值。如何找出执行的实际“最终”查询?

4

6 回答 6

3

我做了以下事情:

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

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

于 2013-05-22T14:44:20.670 回答
1

我还没有看到这种方法。

并且在任何情况下,准备好的语句都会使用 ?customerID,?firstname 参数发送到服务器,然后单独发送实际参数 - mysql 驱动程序不会像您那样构建最终的 sql 查询不要使用准备好的语句。

于 2009-08-30T22:19:14.047 回答
1

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

.AddWithValue("?customerID", m_CustomerID)

如果 m_CustomerID 包含文本

哈哈,我在窃取你的数据;随便丢表;

然后它不会最终在服务器上执行。AddWithValue为你解决这个问题。

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

于 2009-09-17T11:39:04.833 回答
0

我也有同样的需求。

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

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

log=queries.txt

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

于 2011-02-10T20:21:50.653 回答
0

您必须自己构建它。

参数不只是被放入字符串中,然后作为 SQL 语句运行。RDBMS 将实际准备 SQL,然后根据需要使用参数值。因此,没有一条 SQL 语句进入服务器。要查看 SQL 是什么,您必须执行以下操作:

Console.WriteLine("REPLACE INTO `customer` VALUES('" & m_CustomerID & _
    "', '" & m_FirstName & "', '" & m_LastName & "')")
于 2009-08-30T22:16:28.483 回答
0

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

于 2011-02-12T17:13:58.237 回答