【发布时间】:2010-09-28 07:12:32
【问题描述】:
我使用 C# 连接到数据库,然后使用 Ad hoc SQL 来获取数据。这个简单的 SQL 查询调试起来非常方便,因为我可以记录 SQL 查询字符串。如果我使用参数化的 SQL 查询命令,有没有办法记录 sql 查询字符串以进行调试?
【问题讨论】:
我使用 C# 连接到数据库,然后使用 Ad hoc SQL 来获取数据。这个简单的 SQL 查询调试起来非常方便,因为我可以记录 SQL 查询字符串。如果我使用参数化的 SQL 查询命令,有没有办法记录 sql 查询字符串以进行调试?
【问题讨论】:
我认为这就是它。将此代码放置在您配置查询命令的位置,您将进入debugSQL 将执行的 SQL 语句
string debugSQL = cmd.CommandText;
foreach (SqlParameter param in cmd.Parameters)
{
debugSQL = debugSQL.Replace(param.ParameterName, param.Value.ToString());
}
【讨论】:
public static string ToSQL(this IDbCommand Cmd) { ... }并将上面的代码放在{...}中。您需要格式化 debugSQL.Value 以输出特定于数据库中类型的字符串。
SQL 服务器
对于 SQL Server,您可以使用 SQL Server Profiler:
开始一个新的跟踪会话,你会看到所有被执行的东西。也可以过滤。
更多信息here。
其他所有内容
一般,您正在寻找查询分析器。你可以搜索<RDBMS NAME> query profiler,应该会找到有用的。
【讨论】:
DebugDisplayAttribute
使用库的“调试”标志通常是最简单的解决方案。但是您依赖的库可能会欺骗您,或者至少会隐藏一些它会做的事情(例如,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
【讨论】:
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);
}
【讨论】: