3

モジュール式プログラミングは正しいアプローチですが、時には余分な努力と調査が必要な問題につながることがあります。例として3つのデータベース挿入機能がありますInsertName(),InsertAddress(),InsertPhoneNo()。いずれかの関数で例外が発生した場合、これらの関数はすべて実行する必要があります。データベースは変更されません。

私にできることは、3 つすべてを 1 つにマージして、sqltransaction を使用することです。

InsertDetails()
{
using (SqlTransaction sqlTransaction = cn.BeginTransaction()) 
    {
      using (SqlCommand cm = new SqlCommand()) 
      {
        cm.Transaction = sqlTransaction;
        InsertName();//Code to insert name   
        Insertaddress();//code to insert address
        InsertPhoneNo();//code to insert phone no
      }
      sqlTransaction.Commit();
    }
}

しかし、上記の解決策は私のモジュラーアプローチに反しています。複数の関数をマージせずに1つのSQLトランザクションにバインドすることは可能ですか?そうでない場合、これを達成するための最良の方法はどれですか.

4

3 に答える 3

3

コードがメソッド内でどのように記述されているかによって異なりますが、TransactionScope オブジェクトを確認したい場合があるため、コードは次のようになります。

InsertDetails()
{
    using (TransactionScope ts = new TransactionScope()) 
    {    
        InsertName();//Code to insert name   
        Insertaddress();//code to insert address
        InsertPhoneNo();//code to insert phone no

        ts.Complete();    
    }    
}

MSDN の詳細については、こちらをご覧ください。

http://msdn.microsoft.com/en-us/library/system.transactions.transactionscope.aspx

于 2013-05-11T11:18:37.900 に答える
1

適切に設計された分散アーキテクチャ (簡素化されたデータベース中心) では、(少なくとも) レイヤーとドメイン エンティティ層が存在します (他のレイヤーは、ドメイン エンティティ層に依存します)。

ユーザーインターフェース
サービス
Data Access
Common(Domain Entity)

それらの間の依存関係はトップダウンであるため、
ユーザー インターフェイスにはサービスへの参照、サービスからデータ アクセスへの参照があり、すべてのレイヤーはドメイン エンティティに依存しています。

ドメインエンティティごとに別のサービスがCustomer Table ありOrder tableます。 、更新、削除はそのドメイン エンティティに対して行われ、他のエンティティに干渉しません CRUD 操作 2 番目の役割は、任意のサービス オブジェクトが独自の腸炎のデータ アクセス オブジェクトを呼び出さなければならないことです。あなたの質問に答える重要なポイントは次のとおりです。したがって、UpdateCustomerNameAndUpdateAllHisOrders(CustomerEntity customer) というサンプル サービスは、 // 非常に長い名前 を CustomerService クラスに実装できます。概念的には次のようになります。
CustomerEntityOrderEntity
CustomerServiceOrderService
CustomerDACustomerDA





Service layer objects can call other services

UpdateCustomerNameAndUpdateAllHisOrders(CustomerEntity customer)
{
  //StartTransaction();
  CustomerDa.Update(customer);
  var orders = OrderService.GetAllOrders(customer);
  //Modify Orders logic
  OrderService.UpdateOrders(orders);
  //CommiteTransaction();
}

ちなみにデータの整合性のために、トランザクションはサービス層から管理されます
@Scott Chamberlainの回答は独自の方法でこのように行います

サービス層のトランザクション管理については、 Spring.Net
Frameworkがアスペクトとしてこれを行う良いサンプルです。
お役に立てば幸いです。

于 2013-05-11T06:11:15.913 に答える