6

我正在创建一个自动化的数据库查询执行队列,这实际上意味着我正在创建一个 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())
      {

      }
    }
  }
}

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

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

实际上,我可以获得有关我希望能够保存的执行的任何类型的信息。

4

2 回答 2

7

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

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抛出的东西并查看细节。

于 2010-01-21T09:33:02.600 回答
1

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

SqlDataReader 具有属性.RecordsAffected.FieldCount可以告诉您返回了多少数据。

您还可以抓住SqlException以找出一些关于什么(如果有的话)出了问题的信息。

于 2010-01-21T09:31:00.490 回答