有没有更好的方法使用visual Studio调试器查看c中带参数的mysql语句?

dpiehjr4  于 2021-06-18  发布在  Mysql
关注(0)|答案(1)|浏览(241)

我最近修改了一些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语句。

vh0rcniy

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查询)。如果您无法修改客户端程序或更改服务器日志记录设置,则此选项非常理想。

相关问题