有没有更好的方法可以使用Visual Studios调试器在C#中查看带有参数的MySql语句?



我最近一直在更改一些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支持两种客户端/服务器通信协议:文本和二进制。在文本协议中,协议本身不支持命令参数;它们由客户端库模拟。对于连接器/NET,始终使用文本协议,除非在连接字符串中设置IgnorePrepare=true并为每个命令调用MySqlCommand.Prepare()。因此,您很可能正在使用文本协议。这很好,因为记录应用了参数的实际语句会更容易。

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

使用连接器/NET 日志记录

Logging=true添加到连接字符串,并创建侦听QueryOpened事件的TraceListener。这应该包含带有内插参数的完整 SQL 语句。有关设置的说明,请参阅此处。

使用 MySQL 服务器日志记录

在服务器上启用常规查询日志以查看正在执行的所有查询。这是通过--general_log=1 --general_log_file=/var/path/to/file服务器选项完成的。

数据包嗅探

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

最新更新