2011-05-12 48 views
3

有時我必須刪除不同表上的兩條記錄。我怎樣才能以某種方式執行查詢,如果一個失敗,另一個不會執行,反之亦然。換句話說,只有當兩個查詢都成功時數據庫纔會更新,否則不會做任何更改。這樣,如果我得到任何錯誤,我知道什麼都沒有改變。我在C#中執行此查詢爲:僅當所有查詢都成功執行時才更改數據庫

//qDelete is a string containing the query 
// connection - SqlConnection 

SqlCommand cmd = new SqlCommand(qDelete, connection); 
try 
{ 
    var t = cmd.ExecuteNonQuery(); 
    MessageBox.Show("Query succesfully executed \n \n" + "\n\n" + t + " records successfully deleted"); 
} 
catch 
{ 
    //do something here to avoid having any changes to the database   
} 

這太棒了。我的sDelete字符串動態生成,唯一缺少的東西是將語句按正確的順序排列。我發現我必須首先刪除依賴表或表中的記錄,然後再從另一個表中刪除約束條件。我怎麼能看到哪個表依賴於其他表將幫助我構建這個查詢。我可以做一些事情,比如排序所有的字符串,然後放置那些沒有約束的表格,然後放置其他的。我怎樣才能找出哪個表取決於其他表使其更好?

回答

3

您想要使用Transaction將兩個更新集中在一起,並讓它們都成功或者都不發生。該鏈接包含一個可以執行兩次插入的示例,但是您可以輕鬆地將其適用於兩次刪除。

2

您需要使用ADO.Net的事務支持。嘗試

private static void DemoFunc() 
     { 
      SqlConnection conn = new SqlConnection("");//conection string here 
      SqlTransaction transaction; 
      SqlCommand cmd; 

      conn.Open(); 
      transaction = conn.BeginTransaction(); 
      try 
      { 
      cmd = new SqlCommand("Your Query1", conn, transaction);//Your query in place of Your Query1 
      cmd.ExecuteNonQuery(); 

      cmd = new SqlCommand("Your Query2", conn, transaction);//Your query in place of Your Query2   
cmd.ExecuteNonQuery(); 
      transaction.Commit(); 
      } 
      catch (SqlException sqlError) 
      { 
      transaction.Rollback(); 
      } 
      conn.Close(); 
     } 
4

答案是使用交易。使用SqlConnection,使用BeginTransaction()方法開始一個Transaction;它會返回一個SqlTransaction。然後,SqlCommand構造函數將承擔事務以及連接的重載。運行命令,並在try塊的末尾調用事務的Commit()方法。如果發現錯誤,請在事務上調用Rollback()。

+0

你知道交易所用的版本是什麼嗎?它只是2008年還是以前的版本支持這個? – 2011-05-12 19:22:11

+0

事務在數據庫數據維護方面有點兒大問題,所以我希望你能在任何給你ADO.NET的框架中訪問它們。當然.NET Framework 2.0和(VS2005)都會有事務支持。 – KeithS 2011-05-12 19:42:02

+0

我的意思是SQL Server的版本,是基於框架的事務還是基於數據庫? (數據庫是否支持它)。 – 2011-05-12 19:46:06

相關問題