2010-12-20 56 views
5

有一個類型化數據集,其中包含多個相關表以及在這些表之間定義的關係。當我處理數據饋送時,我正在添加,修改和刪除記錄,然後在每個表上調用更新。類型化數據集中的事務

Requests  Reapprovals  UserRole 
RequestId ----- RequestId ----- RoleId 
Reason   RoleId ----/  UserId 

之所以使用強類型DataSet的是,我要檢查現有數據,以確定我是否添加,修改或刪除的記錄,所以,我需要的一切的完全轉儲我的工作(隨着我逐一處理記錄,替代方案將是對數據庫的10,000個查詢)。

我想要事務性支持,但我沒有看到用類型化數據集的方式。例如,當我創建新的重新批准時,我正在創建一個新請求。但是,如果重新批准更新失敗,我不想保留請求。

將更新調用置於TransactionScope意味着如果任何記錄失敗,它們都會失敗。不是我想要的。

我該如何提交或回滾類型化數據集中的相關行?

+0

它可能感興趣你知道,在表上調用Update不,事實上,發送N次查詢到數據庫,一個用於您要更新的每個記錄/添加/除去。所以,通過調用表上的Update或每次更改單行時調用Update,您都不會獲得太多好處。 (使用「批量」發送選項可能會帶來一些好處,但我不知道它有多大)因此,儘管您確實可以使用完整的內存轉儲來確定要修改哪些記錄,但我建議將每個系列操作在自己的交易範圍內進行記錄。 – Pandincus 2010-12-20 15:52:26

+0

知道行一次更新一個,並且在我修改它們時考慮每次更新一行......對我進行調整的事情是我在表上調用Update(),它檢查每行以查看是否它需要更新。這意味着我正在迭代10,000多行10,000次以找到已更新的一行。不知道這樣的表現會是巨大的還是微不足道的。 – 2010-12-20 18:51:56

+0

Pandincus>如果你想輸入你所說的答案,我會接受它。看起來我的選擇要麼是按照你的建議採取行動,要麼接受/拒絕整體數據集更改:(謝謝! – 2011-01-01 19:28:40

回答

3

您可以使用常規事務處理,並像下面的示例一樣實現TableAdapterManager中的事務處理功能。

第一種方法使用常規事務,

public void savewithTransacition() 
    { 
     DataSet1TableAdapters.Table1TableAdapter taTbl1 = new DataSet1TableAdapters.Table1TableAdapter(); 
     DataSet1TableAdapters.Table2TableAdapter taTbl2 = new DataSet1TableAdapters.Table2TableAdapter(); 
     SqlTransaction st = null; 
     SqlConnection sc = new SqlConnection("ur conneciton string"); 
     try 
     { 
      sc.Open(); 
      st = sc.BeginTransaction(); 

      taTbl1.Transaction = st; 
      taTbl2.Transaction = st; 
      st.Commit(); 
     } 
     catch (System.Exception ex) 
     { 
      st.Rollback(); 
      throw ex; 
     } 


    } 

Second..with表適配器經理..

public void SaveWithManager() 
    { 
     DataSet1TableAdapters.TableAdapterManager mgr1 = new DataSet1TableAdapters.TableAdapterManager(); 
     DataSet1TableAdapters.Table1TableAdapter taTbl1 = new DataSet1TableAdapters.Table1TableAdapter(); 
     DataSet1TableAdapters.Table2TableAdapter taTbl2 = new DataSet1TableAdapters.Table2TableAdapter(); 

     mgr1.Table1TableAdapter = taTbl1; 
     mgr1.Table2TableAdapter = taTbl2; 
     mgr1.UpdateOrder = DataSet1TableAdapters.TableAdapterManager.UpdateOrderOption.InsertUpdateDelete; 
     mgr1.UpdateAll(this); 
    } 

使用此選項可以爲表,以節省組創建TAManagers。就像你想要一個組保存,即使另一個組失敗一樣。

+0

我正在挖掘事務管理器信息,但它對於事務來說是一個全新的級別我不是很熟悉,你有什麼代碼示例,或者是資源鏈接嗎?謝謝! – 2010-12-21 15:47:13

+0

修改了一些示例代碼,你可以選擇任何適合你的代碼 – paragy 2010-12-21 18:14:00

+0

展望未來, 。謝謝! – 2010-12-22 16:23:38

0

您可以使用事務範圍不同的作用域選項

+0

問題是從主.Update()調用中分離單個更新,以便某些可能會成功,而有些失敗 – 2010-12-21 19:43:39

+0

您可以使用S壓迫選項不能嗎?通過這種方式,在您的交易範圍內使用Suppress選項的代碼將不會參與您的父交易... – pdiddy 2010-12-21 23:26:01

+0

我不認爲您瞭解我正在嘗試執行的操作 – 2010-12-22 16:23:11

相關問題