2013-02-18 72 views
-1

在下面的代碼中,如果cmd1和cmd2與cmd3失敗一起傳遞。做c#中止所有塊(嘗試塊)?,或者繼續執行cmd1和cmd2?。關於異常處理

   try 
      { 

       sqlConnection1.Open(); 
       cmd1.ExecuteNonQuery(); 
       cmd2.ExecuteNonQuery(); 
       cmd3.ExecuteNonQuery(); 

      } 
      catch (Exception ex) 
      { 
       MessageBox.Show("An error occured " + ex.Message); 
      } 

      finally 
       { 
        sqlConnection1.Close(); 
       } 

回答

1

CMD1和CMD2將執行在指定的場景和CMD3異常將由異常處理捕獲。

爲了實現中止CMD1和CMD2如果CMD3失敗的行爲,你會把所有的SQL命令在單個存儲過程和使用TRANSACTION and ROLLBACK

0

給您的方案CMD1和CMD2將執行,如果有然後它會去抓塊。如果cmd1失敗,那麼它不會執行cmd2和cmd3,並會去catch塊。此外,它值得閱讀此鏈接here

0

cmd1和cmd2將被執行,因爲try/catch塊不會自動執行查詢事務。但是,如果cmd3失敗,則可以使用transaction scope執行回滾並撤消在cmd1/cmd2中所做的更改。

0

當引發異常時,代碼停止跳轉到nearst catch塊。

低於發生異常的地方的任何代碼 - 不會執行。

在你塞納里奧也許你要考慮使用TransactionScope這樣的:

using(var trans = new TransactionScope()) 
{ 
    try 
    { 
    //your setup code goes here 

    sqlConnection1.Open(); 
       cmd1.ExecuteNonQuery(); 
       cmd2.ExecuteNonQuery(); 
       cmd3.ExecuteNonQuery(); 

    trans.Complete(); 
    } 
    catch(Exception) 
    { 
    //handle exception 
    } 
} 

對數據庫所做的任何更改都被回滾,如果不執行statemenet trans.Complete()