我使用C#连接数据库,然后使用Ad hoc SQL获取数据。这个简单的SQL查询非常便于调试,因为我可以记录SQL查询字符串。如果我使用参数化SQL查询命令,有没有办法记录sql查询字符串以进行调试?
答案 0 :(得分:4)
我认为这是关于它的。将此代码放在已配置查询命令的位置,您将获得将要执行的SQL语句的debugSQL
string debugSQL = cmd.CommandText;
foreach (SqlParameter param in cmd.Parameters)
{
debugSQL = debugSQL.Replace(param.ParameterName, param.Value.ToString());
}
答案 1 :(得分:3)
SQL Server
对于SQL Server,您可以使用SQL Server Profiler:
启动一个新的跟踪会话,您将看到每个执行的内容。你也可以过滤它。
更多信息here。
其他一切
一般情况下,您正在寻找查询分析器。您可以搜索<RDBMS NAME> query profiler
,并找到有用的内容。
答案 2 :(得分:0)
使用库的“debug”标志通常是最简单的解决方案。但是你依赖于可能骗你的库或至少隐藏它会做的一些事情(例如,psycopg默默地改变默认的隔离级别)。
在DBMS端,您始终可以激活日志记录。它的好处在于,无论您的客户端库如何,您都将获得确切的SQL请求。在这方面,它比库的“debug”标志更好。但是,在某些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
答案 3 :(得分:0)
equisde的答案很有帮助,但是为了处理bool和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);
}