如何调试参数化SQL查询

问题描述:

我使用C#连接数据库,然后使用Ad hoc SQL来获取数据。这个简单的SQL查询非常方便调试,因为我可以记录SQL查询字符串。如果我使用参数化的SQL查询命令,是否有任何方法可以为调试目的而记录sql查询字符串?如何调试参数化SQL查询

您可以使用应用程序端的参数进行记录,也可以在数据库服务器上打开查询日志记录以查看它正在接收的查询。

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

在DBMS方面,您始终可以激活日志记录。与它的好处是,无论你的客户端库如何,你都会得到确切的SQL请求。在这方面,它比图书馆的“调试”标志更好。但是,在某些DBMS上,日志语句可能非常慢(PostgreSQL就是这种情况)。

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

PostgreSQL,激活记录在postgresql.conf秉乘:

log_statement = 'all'     # none, ddl, mod, all 

我通常也使用:

log_connections = on 
log_disconnections = on 
log_duration = on 
log_hostname = on 

我觉得这是它。将此代码放置在您所配置的查询命令,你将有到debugSQL将被执行

string debugSQL = cmd.CommandText; 

foreach (SqlParameter param in cmd.Parameters) 
{ 
    debugSQL = debugSQL.Replace(param.ParameterName, param.Value.ToString()); 
} 
+0

您可以扩展方法: '公共静态字符串ToSQL(这个IDbCommand的CMD){。 ..}' 并将上面的代码放在{...}中。你需要格式化`debugSQL.Value`来输出特定于数据库类型的字符串。 – laifukang 2014-04-22 07:42:02

+1

debugSQL.ParameterName和debugSQL.Value应该是param.ParameterName和param。价值 – JoeHz 2017-04-24 06:13:03

SQL服务器

对于SQL Server你可以将用户的SQL Server Profiler中的SQL语句:

SQL Profiler

启动一个新的跟踪会话,你会看到它被执行everyting。你也可以过滤它。

Trace

更多信息here

一切其他

将军,你找一个查询分析器。您可以搜索<RDBMS NAME> query profiler并找到有用的东西。

通过equisde答案是有帮助的,但处理布尔和char类型,我需要这种变化:

string debugSQL = dbCommand.CommandText; 
foreach (SqlParameter param in dbCommand.Parameters) 
{ 
    string val = param.Value.ToString(); 
    switch (param.DbType) 
    { 
     case System.Data.DbType.AnsiString: 
       val = "'" + val + "'"; 
      break; 
     case System.Data.DbType.Boolean: 
      val = (val == "True" ? "1" : "0"); 
      break; 
    } 
    debugSQL = debugSQL.Replace("@" + param.ParameterName, val); 
}