2012-03-15 83 views
5

我有下面的代碼位,其運行的SQL語句:無法檢測SQL錯誤

int rowsEffected = 0; 
using (SqlConnection dbConnection = new SqlConnection(dbConnectionString)) 
{ 
    try 
    { 
     dbConnection.InfoMessage += new SqlInfoMessageEventHandler(dbConnection_InfoMessage); 
     dbConnection.FireInfoMessageEventOnUserErrors = true; 

     dbConnection.Open(); 


     SqlCommand command = dbConnection.CreateCommand(); 
     command.CommandTimeout = 0; 
     command.CommandText = sqlStatement; 

     rowsEffected = command.ExecuteNonQuery(); 
    } 
    catch (Exception e) 
    { 
     // Handle exception 
    } 
} 

長期運行的SQL語句可以通過提高使用RAISERROR與錯誤通過SqlInfoMessageEventHandler報告進度適當的嚴重性值。

將FireInfoMessageEventOnUserErrors設置爲true的原因是因爲,如果沒有此操作,則只有在ExecuteNonQuery()返回時纔會同時處理來自SQL語句的所有消息。將此值設置爲true時,進度消息將按照SQL語句引發的進行處理。

正如屬性的名稱所暗示的,事件處理程序也會在錯誤時觸發,而不僅僅是爲SQL語句的進度反饋保留的特定嚴重級別。

時進度反饋的事件處理程序是這樣的:

public void dbConnection_InfoMessage(object sender, SqlInfoMessageEventArgs e) 
{ 
    if (e.Errors.Count > 0) 
    { 
     throw new Exception("Something bad happened"); 
    } 

    // Report progress 
} 

正如你看到的,我可以當「E」而引發異常不會做任何事情中的屬性發生錯誤檢測。我希望執行會落入catch塊,但事實並非如此。

如何在ExcecuteNonQuery()方法後發現錯誤?

TIA

+0

你可以在一個線程中運行你的代碼,並在該函數中調用一個thread.abort – SamFisher83 2012-03-15 16:25:56

+1

+1:我喜歡只從閱讀中學到東西的問題。 – NotMe 2012-03-16 17:24:37

回答

3

我設法解決了一個工作。我已經爲包含事件處理程序的類添加了一個屬性。如果發生錯誤,我將在該類中發送錯誤標誌屬性,然後可以在調用ExcecuteNonQuery()後讀取該屬性。如果出現錯誤,那麼我可以執行我的清理代碼。謝謝回覆。

+0

請將此答案標記爲已回答 – Marcin 2012-03-17 11:43:06

+0

我必須做類似的事情,但是對於外部線程必須訪問DB Command對象的情況,所以我存儲了最後一個用於阻止SQL調用可能被檢查或取消的情況另一個線程。 – Brain2000 2015-07-14 15:52:18

1

使用SqlException類,而不是Exception類。然後看看e.Errors

+0

感謝您的回答。我實際上並沒有使用異常,我使用的是自定義異常,但僅僅爲了示例代碼,我將其更改爲Exception。您無權訪問調用ExcecuteNonQuery()的代碼中的e.Errors。 – millie 2012-03-16 17:19:22