【问题标题】:C# SqlDataReader Execution Statistics and InformationC# SqlDataReader 执行统计和信息
【发布时间】:2011-01-07 15:50:17
【问题描述】:

我正在创建一个自动化的数据库查询执行队列,这实际上意味着我正在创建一个 SQL 查询队列,这些查询会被一一执行。

使用类似于以下的代码执行查询:

using (SqlConnection cn = new SqlConnection(ConfigurationManager.ConnectionStrings["NorthwindConnectionString"].ConnectionString))
{
  cn.Open();
  using (SqlCommand cmd = new SqlCommand("SP", cn))
  {
    cmd.CommandType = CommandType.StoredProcedure;
    using (SqlDataReader dr = cmd.ExecuteReader())
    {
      while (dr.Read())
      {

      }
    }
  }
}

我想做的是尽可能多地收集有关执行的信息。 花了多长时间。有多少行受到影响。

最重要的是,如果失败了,为什么失败。

我可以得到任何关于我希望能够保存的执行的信息。

【问题讨论】:

  • 请注意,它不一定是 SP,它可能是类似“TRUNCATE TABLE daily_Stats”的查询,或者是更新命令,或者是插入命令

标签: c# sql-server-2005 statistics sqldatareader sqlcommand


【解决方案1】:

尝试使用内置统计信息来获取执行时间和选择/受影响的行:

using (SqlConnection cn = new SqlConnection(ConfigurationManager.ConnectionStrings["NorthwindConnectionString"].ConnectionString))
{
  cn.Open();
  cn.StatisticsEnabled = true;
  using (SqlCommand cmd = new SqlCommand("SP", cn))
  {
    cmd.CommandType = CommandType.StoredProcedure;
    try
    {
      using (SqlDataReader dr = cmd.ExecuteReader())
      {
        while (dr.Read())
        {

        }
      }
    }
    catch (SqlException ex)
    {
      // Inspect the "ex" exception thrown here
    }
  }

  IDictionary stats = cn.RetrieveStatistics();
  long selectRows = (long)stats["SelectRows"];
  long executionTime = (long)stats["ExecutionTime"];
}

MSDN上查看更多信息。

我可以看到您找出失败原因的唯一方法是检查抛出的 SqlException 并查看详细信息。

【讨论】:

  • 对于任何错误,我应该将所有内容包装在 try Catch 中并捕获 SqlException,还是有更明确的方法来监控事情是否正确执行?
  • @Theofanis Pantelides:更新以显示您应该在哪里捕获处决异常。您还应该将 cn.Open() 的块也放在 try-catch 中,以避免连接失败时出现严重错误。
  • 一个更快速的问题:执行后 (IDictionary stats = cn.RetrieveStatistics();) 我可以关闭连接并继续使用“统计”吗?还是连接必须保持打开状态?
  • 是的,您可以在检索统计信息后关闭连接。据我所知,当您调用 .RetrieveStatistics() 时,您必须保持连接仍然打开,但生成的 IDictionary 不会以任何方式与连接绑定,并且可以安全地使用。我写了一个类来加载来自IDictionary的所有细节作为“时间框架”,然后将其添加到“时间线”中,用于更详细的分析。它有助于不必一直使用 IDictionary 键/值查找。
【解决方案2】:

虽然我有点不确定你的问题到底是什么,但我的意思是,如果你想要一个可能对保存有用的统计数据列表,或者如何获取你上面提到的统计数据。

SqlDataReader 具有属性.RecordsAffected.FieldCount,可以告诉您返回的数据量。

您还可以拨打SqlException 以了解有关问题(如果有的话)的一些信息。

【讨论】:

    猜你喜欢
    • 2011-09-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-03-15
    • 2010-10-29
    • 1970-01-01
    • 1970-01-01
    • 2011-05-08
    相关资源
    最近更新 更多