2010-01-21 53 views
6

我正在創建一個自動化的數據庫查詢執行隊列,這意味着我正在創建一個一個接一個地執行的SQL查詢隊列。C#SqlDataReader執行統計信息

查詢使用類似於下面的代碼執行:

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()) 
     { 

     } 
    } 
    } 
} 

我想要做的是收集儘可能多的信息,我可以對執行。 需要多長時間。有多少行受到影響。

最重要的是,如果它失敗了,爲什麼失敗。

真的可以獲得任何有關我希望能夠保存的執行的信息。

+0

請注意,它不一定是一個SP,它可能是一個像查詢'TRUNCATE TABLE daily_Stats',或更新命令,或插入命令 – 2010-01-21 09:29:00

回答

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拋出並查看細節。

+0

如何處理任何錯誤,我應該包裝一切在一個嘗試抓住並捕獲SqlException,還是有更明確的方式來監視事情是否正確執行? – 2010-01-21 09:40:29

+0

正如唐下面建議的 – 2010-01-21 09:41:09

+1

@Theofanis Pantelides:已更新,以顯示您應該從哪裏捕捉執行異常。您還應該將'cn.Open()'塊放入try-catch中,以避免連接失敗時出現令人討厭的錯誤。 – Codesleuth 2010-01-21 09:47:21

1

雖然我有點不確定你的問題是什麼,我的意思是如果你想要一個統計數據列表,可能有助於保存或如何獲得上面提到的統計數據。

SqlDataReader具有屬性.RecordsAffected.FieldCount,它會告訴您一些關於返回多少數據的信息。

你也可以通過SqlException找到一些關於什麼(如果有的話)出錯的信息。