C# 是否有更好的方法使用Visual Studio调试器在C中查看带有参数的MySql语句?

C# 是否有更好的方法使用Visual Studio调试器在C中查看带有参数的MySql语句?,c#,mysql,visual-studio,parameterized-query,C#,Mysql,Visual Studio,Parameterized Query,我最近一直在修改一些C程序,以便为一些最初使用串联字符串编写的MySQL语句添加适当的参数化。我的语句总是会遇到一些问题,我无法找到一种方法来直接查看完整的MySQL语句,其中应用了参数,除了我将MySQL命令传递给以下对象的解决方法之外: private string getMySqlStatement(MySqlCommand cmd) { string result = cmd.CommandText.ToString(); foreach (MySqlParameter

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

MySQL支持两种客户端/服务器通信协议:文本和二进制。在文本协议中,协议本身不支持命令参数;它们由客户端库模拟。对于Connector/NET,始终使用文本协议,除非在连接字符串中设置IgnorePrepare=true并调用MySqlCommand.Prepare以执行每个命令。因此,最有可能的情况是您正在使用文本协议。这很好,因为使用应用的参数记录实际语句会更容易

有三种方式可以查看正在执行的语句:

使用连接器/网络日志 将Logging=true添加到连接字符串中,并创建侦听QueryOpened事件的TraceListener。这应该包含插入参数的完整SQL语句。有关设置此项的说明

使用MySQL服务器日志记录 在服务器上启用以查看正在执行的所有查询。这是通过-general\u log=1-general\u log\u file=/var/path/to/file服务器选项完成的

看封包
如果您没有使用SslMode=Required加密客户端和服务器之间的连接,则可以使用WireShark捕获客户端和服务器之间的网络流量。WireShark有MySQL协议分析器,可以检查MySQL流量并识别包含SQL查询的命令包。如果您无法修改客户端程序或更改服务器日志记录设置,则此选项非常理想。

如果未模拟准备好的语句,则参数将应用于服务器端,因此您无法在客户端中看到它,因为它从未出现过。