我最近修改了一些c程序,为一些mysql语句添加了适当的参数化,这些语句最初是用串联字符串编写的。我的语句总是会遇到一些问题,我找不到方法直接查看完整的mysql语句,其中应用了参数,除了我将mysql命令传递给以下对象的解决方法之外:
private string getMySqlStatement(MySqlCommand cmd)
{
string result = cmd.CommandText.ToString();
foreach (MySqlParameter p in cmd.Parameters)
{
string addQuote = (p.Value is string) ? "'" : "";
result = result.Replace(p.ParameterName.ToString(), addQuote + p.Value.ToString() + addQuote);
}
return result;
}
这是可行的,但我想知道是否有更合适的方法来查看应用了参数的完整语句。仔细看,在到达服务器之前,这些参数似乎并没有被实际应用,这是正确的吗?在这种情况下,我想我可以坚持我上面的功能,但我只是想知道是否有更好的方法来做这件事。
注意:我只是出于调试的目的使用这个函数,所以我可以看到mysql语句。
1条答案
按热度按时间vh0rcniy1#
mysql支持两种客户端/服务器通信协议:文本和二进制。在文本协议中,协议本身不支持命令参数;它们由客户端库模拟。对于connector/net,除非设置
IgnorePrepare=true
在连接字符串中MySqlCommand.Prepare()
对于每个命令。所以最有可能的情况是您使用的是文本协议。这很好,因为使用应用的参数记录实际语句会更容易。有三种方式可以查看正在执行的语句:
使用连接器/网络日志
添加
Logging=true
连接字符串并创建TraceListener
那就是倾听QueryOpened
事件。这应该包含完整的sql语句,其中插入了参数。关于设置的说明在这里。使用mysql服务器日志
启用服务器上的常规查询日志以查看正在执行的所有查询。这是通过
--general_log=1 --general_log_file=/var/path/to/file
服务器选项。数据包嗅探
如果你不使用
SslMode=Required
(要加密客户端和服务器之间的连接),则可以使用wireshark捕获客户端和服务器之间的网络流量。wireshark有mysql协议分析器,可以检查mysql流量并识别命令包(包含sql查询)。如果您无法修改客户端程序或更改服务器日志记录设置,则此选项非常理想。