如何调试参数化的SQL查询

Dav*_*.ca 4 c# sql

我使用C#建立数据库连接,然后使用临时SQL获取数据。这个简单的SQL查询非常易于调试,因为我可以记录SQL查询字符串。如果我使用参数化的SQL查询命令,是否有任何方法可以记录SQL查询字符串以进行调试?

equ*_*sde 5

我想这就是它。将此代码放在配置了查询命令的位置,然后您将在debugSQL将要执行的SQL语句中

string debugSQL = cmd.CommandText;

foreach (SqlParameter param in cmd.Parameters)
{
    debugSQL = debugSQL.Replace(param.ParameterName, param.Value.ToString());
}
Run Code Online (Sandbox Code Playgroud)

  • 您可以创建一个扩展方法:“public static string ToSQL(this IDbCommand Cmd) { ... }”并将上面的代码放入 {...} 中。您需要格式化“debugSQL.Value”以输出特定于数据库中类型的字符串。 (2认同)
  • debugSQL.ParameterName和debugSQL.Value应该是param.ParameterName和param.Value (2认同)
  • @JoeHz 啊!小错别字。谢谢! (2认同)

bor*_*yer 1

使用库的“调试”标志通常是最简单的解决方案。但是你依赖的库可能会对你撒谎,或者至少隐藏它会做的一些事情(例如,psycopg 默默地更改默认的隔离级别)。

在 DBMS 端,您始终可以激活日志记录。它的好处是,无论您的客户端库做什么,您都将获得准确的 SQL 请求。在这方面,它比库的“调试”标志更好。但是,在某些 DBMS 上,记录语句可能非常慢(PostgreSQL 就是这种情况)。

如果您有足够的权限,另一种解决方案是在网络上使用嗅探器。Wireshark可以解码许多 DBMS 的协议并呈现实际的 SQL 请求。

PostgreSQL上,激活日志记录是postgresql.conf通过以下方式完成的:

log_statement = 'all'                   # none, ddl, mod, all
Run Code Online (Sandbox Code Playgroud)

我通常也使用:

log_connections = on
log_disconnections = on
log_duration = on
log_hostname = on
Run Code Online (Sandbox Code Playgroud)