C#SqlDataReader执行统计信息和信息
我正在创建一个自动化的DB查询执行队列,这本质上意味着我正在创建一个SQL查询队列,这些查询一个接一个地执行 查询使用与以下类似的代码执行:C#SqlDataReader执行统计信息和信息,c#,sql-server-2005,statistics,sqldatareader,sqlcommand,C#,Sql Server 2005,Statistics,Sqldatareader,Sqlcommand,我正在创建一个自动化的DB查询执行队列,这本质上意味着我正在创建一个SQL查询队列,这些查询一个接一个地执行 查询使用与以下类似的代码执行: using (SqlConnection cn = new SqlConnection(ConfigurationManager.ConnectionStrings["NorthwindConnectionString"].ConnectionString)) { cn.Open(); using (SqlCommand cmd = new 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())
{
}
}
}
}
我想做的是收集尽可能多的关于执行的信息。
花了多长时间。有多少行受到影响
最重要的是,如果失败了,为什么失败
关于我想要保存的执行情况,我可以得到任何类型的信息。虽然我有点不确定你的问题到底是什么,但我的意思是,如果你想要一个有助于保存的统计数据列表,或者如何获得你上面提到的统计数据 SqlDataReader具有属性
.RecordsAffected
和.FieldCount
,可以告诉您返回了多少数据
您还可以捕获
SqlException
以查找有关出错原因(如果有)的一些信息。尝试使用内置的执行时间和选定/受影响行的统计信息:
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"];
}
请参阅有关的详细信息
我能看到您找出某些失败原因的唯一方法是检查抛出的数据并查看详细信息。请注意,它不一定是SP,它可能是类似“TRUNCATE TABLE daily_Stats”的查询,也可能是更新命令或插入命令,如果有错误,我应该用try-Catch包装所有内容并捕获SqlException,还是有一种更明确的方法来监控事情是否正确执行?@Theofanis Pantelides:更新以显示您应该从执行中捕获异常的位置。您还应该将
cn.Open()
的块也放在try-catch中,以避免连接失败时出现严重错误。还有一个简单的问题:执行(IDictionary stats=cn.RetrieveStatistics();)后,我可以关闭连接并继续使用“stats”吗?或者连接必须保持打开状态?是的,您可以在检索统计信息后关闭连接。据我所知,在调用.RetrieveStatistics()
时,必须保持连接处于打开状态,但生成的IDictionary
不会以任何方式与连接绑定,可以安全地使用。我编写了一个类,将IDictionary
中的所有细节作为“时间框架”加载,然后将其添加到“时间线”中,用于更详细的分析。它有助于不必一直使用IDictionary
键/值查找。