如何调试参数化的SQL查询

时间:2008-12-24 06:26:40

标签: c# sql

我使用C#连接数据库,然后使用Ad hoc SQL获取数据。这个简单的SQL查询非常便于调试,因为我可以记录SQL查询字符串。如果我使用参数化SQL查询命令,有没有办法记录sql查询字符串以进行调试?

4 个答案:

答案 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:

SQL Profiler

启动一个新的跟踪会话,您将看到每个执行的内容。你也可以过滤它。

Trace

更多信息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);
}