2011-11-09 18 views
0

ADO.NET - Updating Multiple DataTablesSqlDataAdapter的多個表和交易

我發現上面的問題,這正是我要尋找並試圖實現一個解決方案...

我想看到更新多一個最好的解決方案表進入sqlserver 2008並確保多個表上的事務。如果插入到一個表失敗,則回滾其他表上的先前更新。

  1. SqlDataAdapter的一次只
  2. 我知道我們可以在一個時間上的一個DataAdapter的做交易,但需要更新,從上面提供的答案修改多個表

下面是代碼更新一個表,但它與dataadapter錯誤。我想我需要設置插入,更新和刪除命令,但不知道如果有多個表如何工作?有人可以填寫缺失的鏈接嗎?

 using (SqlConnection con = new SqlConnection(SqlServerConnectionString)) 
     { 
      con.Open(); 
      //table is an array of datatable and contains data to be inserted 
      for (int i = 0; i < table.Length; i++) 
      { 
       ds.Tables.Add(table[i]); 
      } 

      SqlTransaction trans = con.BeginTransaction(); 

      SqlDataAdapter dataAdapter = new SqlDataAdapter(); 
      //Need to set insert,select, update, delete???? on multiple tables? 

      //dataAdapter.Fill(ds); 
      dataAdapter.InsertCommand.Transaction = trans; //null object error here 
      dataAdapter.UpdateCommand.Transaction = trans; 
      dataAdapter.DeleteCommand.Transaction = trans; 

      try 
      { 

       dataAdapter.Update(ds); 
       trans.Commit(); 
      } 
      catch(Exception ex) 
      { 
       trans.Rollback(); 

      } 
+0

閱讀該答案的第二條評論。 – LarsTech

+0

我發佈之前已經閱讀過很多次;不幸的是我仍然迷惑。但尋找一個最佳實踐,實現這... – wirble

回答

0

您確實需要爲每個人定義命令 - 我建議使用SqlCommandBuilder作爲工作。

但是,請注意,SqlDataAdapter僅適用於一個 DataTable。從文檔中不清楚這是否爲第一個表格:

Update方法在執行更新之前從第一個映射中列出的表中檢索行。

http://msdn.microsoft.com/en-us/library/system.data.common.dataadapter.update.aspx

...或者,也許只是在名爲表DataSet中的唯一表:

更新|從名爲「Table」的DataTable中爲指定的DataSet中的每個插入,更新或刪除的行調用相應的INSERT,UPDATE或DELETE語句。

http://msdn.microsoft.com/en-us/library/system.data.common.dataadapter.update.aspx

在任何情況下,你的循環在桌子的人都需要調用更新,如果您使用的是SqlDataAdapter的。

編輯

在任何情況下,SqlDataAdapter的是這裏沒有一個很好的選擇,因爲據我可以告訴。如果你所要做的只是在DataTable之間共享一個事務,只需使用一系列共享一個SqlTransaction的SqlCommands即可。

每個人的輸入(如果這是不夠清楚,我會當我去上班添加代碼示例)

+0

據我所知,數據適配器適用於一個表,但從前面的問題和答案;似乎我們可以使用一個數據集與多個表來執行事務更新。也許情況並非如此。我知道如何遍歷每個數據適配器並添加表,然後調用update。但我想更新一個事務中的多個表?那麼最佳實踐是使用SqlCommandBuilder進行多個表的事務更新? Sqldataadapter和數據集沒有辦法做到這一點? – wirble

+0

您可以重複使用多個SqlCommands的事務。看我的編輯... – sq33G

1

感謝。我認爲以前由@Charlie用這個q/a回答了我的問題:ADO.NET - Updating Multiple DataTables

我想也許你可以使用數據集進行更新,但我想你還是需要創建額外的數據適配器,然後調用update。因此,對上一個問題的回答是唯一的一種簡化的方法來完成@ gamzu07所要做的就是使用數組而不是每次都聲明它。下面的代碼可以工作,但似乎對我來說很遲鈍,除了構建插入命令並執行....之外,有沒有人有更好的主意?

  SqlDataAdapter[] dataAdapter = new SqlDataAdapter[table.Length]; 

      for (int i = 0; i < table.Length; i++) 
      { 

       dataAdapter[i] = new SqlDataAdapter("select * from " + table[i].TableName, con); 
       SqlCommandBuilder cb = new SqlCommandBuilder(dataAdapter[i]); 
       dataAdapter[i].InsertCommand = cb.GetInsertCommand(); 
       dataAdapter[i].Fill(table[i]); 

      } 

      SqlTransaction trans = con.BeginTransaction(); 

      try 
      { 
       for(int i=0;i < table.Length;i++){ 
        dataAdapter[i].InsertCommand.Transaction = trans; 
        dataAdapter[i].Update(table[i]); 
       } 
       trans.Commit(); 
      } 
      catch(Exception ex) 
      { 
       trans.Rollback(); 
      } 
+0

我自己也使用wirble的解決方案。但是請注意,DataAdapter.Update()將爲每個DataRow執行sqlcommand並修改它們的狀態,但是當事務回滾時,那些已修改的DataRowStates將過期。因此,當您訪問代碼中的DataRowState屬性時,應該小心使用此解決方案。 – SuperLucky