【问题标题】:How to debug parameterized SQL query如何调试参数化 SQL 查询
【发布时间】:2010-09-28 07:12:32
【问题描述】:

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

【问题讨论】:

    标签: c# sql


    【解决方案1】:

    我认为这就是它。将此代码放置在您配置查询命令的位置,您将进入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 以输出特定于数据库中类型的字符串。
    • debugSQL.ParameterName 和 debugSQL.Value 应该是 param.ParameterName 和 param.Value
    • @JoeHz 啊!小错字。谢谢!
    【解决方案2】:

    SQL 服务器

    对于 SQL Server,您可以使用 SQL Server Profiler:

    开始一个新的跟踪会话,你会看到所有被执行的东西。也可以过滤。

    更多信息here

    其他所有内容

    一般,您正在寻找查询分析器。你可以搜索<RDBMS NAME> query profiler,应该会找到有用的。

    【讨论】:

    • 谢谢(点个赞),但这是否意味着 C# 只保留被替换的查询,根本不让我看到它?
    • 参数将作为“变量”发送到 SQL 服务器。没有在发送到 sql server 之前替换 sql 查询字符串这样的概念。如果你想在 c# 站点上获得一些东西,它非常依赖于你使用的库。对于普通的 ADO.NET,请查看 equisde's answer。也许你可以用DebugDisplayAttribute
    【解决方案3】:

    使用库的“调试”标志通常是最简单的解决方案。但是您依赖的库可能会欺骗您,或者至少会隐藏一些它会做的事情(例如,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
    

    【讨论】:

      【解决方案4】:

      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);
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-06-09
        • 1970-01-01
        • 2017-09-10
        • 2010-11-18
        • 2011-10-11
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多