2011-03-23 49 views
3

嗨 如何使用類型化數據集進行事務處理?比方說,我有一個記錄表和記錄詳細信息表,我必須將其中一個保存在記錄表和記錄詳細信息表中的所有詳細信息中。 我該如何使用?我發現事務可以與無類型數據集一起使用,但我沒有看到它與類型化數據集。有人能告訴我我該怎麼做嗎?如何在C#中使用類型化數據集進行事務?

凱文

回答

5

CodeProject上有一個nice article(和代碼),介紹如何擴展類型化數據集以使事務在使用TransactionScope時不會被提升爲分佈式事務。

摘要:通過在部分類中添加方法來使用事務作用域來修改底層SqlCommand對象以參與同一事務。從參考的適配器

using (SqlTransaction transaction = connection.BeginTransaction()) 
{ 
     // These methods will update all relevant command objects’ transaction property 
     adapter1.EnlistTransaction(transaction); 
     adapter2.EnlistTransaction(transaction); 

     adapter1.Update(table1); 
     adapter2.Update(table2); 

     transaction.Commit(); 
} 

代碼示例:

public partial class [TableAdapterName] 
{ 
    public void EnlistTransaction(System.Data.SqlClient.SqlTransaction transaction) 
    { 
     System.Data.SqlClient.SqlTransaction _transaction; 

     if (this._transaction != null) 
     { 
      throw new System.InvalidOperationException 
     ("This adapter has already been enlisted in a transaction"); 
     } 
     else 
     { 
      this._transaction = transaction; 
      Adapter.UpdateCommand.Transaction = _transaction; 
      Adapter.InsertCommand.Transaction = _transaction; 
      Adapter.DeleteCommand.Transaction = _transaction; 
     } 
    } 
} 
+0

非常感謝。我會試試看 。 :d – kevin 2011-03-23 02:39:11

1

可以使用的TransactionScope和TransactionScope的對象的範圍內調用相應的更新。

請參閱此鏈接中提供的示例。 TransactionScope

提供了一個更接近的例子here

+0

謝謝你的信息。 :D – kevin 2011-03-23 02:39:32

1

我不推薦使用的TransactionScope,因爲它是很難處理代碼重構,因爲你可以用一個巨大的代碼量,這是怎麼了我建議:

這個答案,因爲它增加了交易的所有命令和不僅爲持久性

擴展您的漢邦這是不同的人Adapter類:

partial class YourTableAdapter 
{ 
    public SqlTransaction Transaction 
    { 
     set 
     { 
      if (this.CommandCollection != null) 
      { 
       for (int i = 0; i < this.CommandCollection.Length; i++) 
       { 
        this.CommandCollection[i].Connection = value.Connection; 
        this.CommandCollection[i].Transaction = value; 
       } 
      } 

      this.Connection = value.Connection; 
      this._adapter.AplicaTransaction(value); 
     } 
    } 
} 

擴展方法:

namespace System 
{ 
    public static class DALSqlExtension 
    { 
     public static void AplicaTransaction(this SqlDataAdapter _adapter, SqlTransaction transaction) 
     { 
      if (_adapter == null) 
      { 
       return; 
      } 
      if (_adapter.InsertCommand != null) 
      { 
       _adapter.InsertCommand.Transaction = transaction; 
       _adapter.InsertCommand.Connection = transaction.Connection; 
      } 
      if (_adapter.UpdateCommand != null) 
      { 
       _adapter.UpdateCommand.Transaction = transaction; 
       _adapter.UpdateCommand.Connection = transaction.Connection; 
      } 
      if (_adapter.DeleteCommand != null) 
      { 
       _adapter.DeleteCommand.Transaction = transaction; 
       _adapter.DeleteCommand.Connection = transaction.Connection; 
      } 
      if (_adapter.SelectCommand != null) 
      { 
       _adapter.SelectCommand.Transaction = transaction; 
       _adapter.SelectCommand.Connection = transaction.Connection; 
      } 
     } 
    } 
} 
相關問題