3

模块化编程是正确的方法,但它有时会导致需要额外努力和研究的问题。我有三个数据库插入功能,InsertName(),InsertAddress(),InsertPhoneNo()以它为例。如果任何函数发生异常,所有这些函数都必须执行,不会对数据库进行任何更改。

我能做的是将所有三者合二为一并使用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();
    }
}

但上面的解决方案与我的模块化方法背道而驰。是否可以将多个函数绑定到一个 sql 事务而不合并它们,如果没有,这是实现这一目标的最佳方法。

4

3 回答 3

5

只需传入cn和传入sqlTransaction函数,然后让函数使用传入的参数,而不是打开它们自己的连接。

于 2013-05-11T05:08:53.320 回答
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

在设计良好的分布式架构(简化和以数据库为中心)中,您将(至少)有层和域实体层(其他层将依赖于支配实体层)

用户界面
服务
数据访问
通用(域实体)

它们之间的依赖关系是自上而下的,因此
用户界面具有对服务的引用,对数据访问的服务,并且所有层都依赖于域实体

每个域实体我们将有一个单独的服务,例如,如果我们有一个Customer Table 和一个Order table我们将有:
CustomerEntityOrderEntity(域实体对象)
CustomerServiceOrderService(服务层对象)
CustomerDACustomerDA(数据访问层对象)

通常任何 DataAccess 对象都会做插入,更新,删除对其Domain实体,不会干扰其他实体的CRUD操作
第二个作用是任何服务对象都必须调用自己的肠炎的数据访问对象。

将回答您的问题的关键点在这里:
Service layer objects can call other services,所以一个名为 UpdateCustomerNameAndUpdateAllHisOrders(CustomerEntity customer) // 一个很长的名称的示例服务
可以在 CustomerService 类中实现,概念上是这样的:

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 回答