C#父/子对象的结构SQL插入事务

问题描述 投票:-1回答:1

我正在用C#开发一些商业软件对象。每个对象都可以将自身保存到关联的数据库中(例如每个对象):

public void Save()
{
    //Collect object attributes and convert to SQLParameters
    //Add SQL Parameters to SQL command and BeginTrans   
    //Execute, if No Errors, commit, otherwise rollback   
}

我已经开始实现继承/父子部分,并且我不知道如何使用内部子对象构造父对象Save()函数,因为:

  • 每个子对象都有自己的Save()方法,并带有与之关联的自己的Connection,SQL命令,BeginTrans,参数逻辑和回滚逻辑等。
  • 每个Object.Save()调用都是针对该对象/数据库类型的特定存储过程。
  • 最重要的是:如果有任何子对象保存失败,我希望整个保存回滚。

例如:

  • 如果对象“ Customer”具有子对象“ CustomerInfo”,“ Account”和“ Dependents”。

  • 执行Customer.Save时,如果子对象“ CustomerInfo”和“ Account”的保存成功,但是子对象“ Dependents FAIL”的保存成功,那么我希望先前的存储回滚到调用客户父对象。

最佳方法是什么?

我想将保存的逻辑(参数格式化,执行和回滚)封装在每个对象中,即

喜欢此:

public void ParentSave()
{ 
   Begin Transaction

   Try
   {
   //For each CHILD Object
   //ChildObject.Save()
   }
   Catch(Save Fail)
   {
      //Rollback all executed saves/transaction(s)
    }

   IF(Success)
   {
      //Save parent
      Commit parent/overall transaction
    }
}

我知道我可以使用“交易”范围,但是我不确定如何构造它,或者我是否应该拥有“嵌套的”交易范围。我以前从未使用过Transaction Scope。我知道Transaction可以与嵌套的Begin / Commit事务一起工作(直到开始trans count变为1才发生真正的提交),但是它对使用其Connection / SQLCommand对象的嵌套事务有效吗?

  • 关于“事务作用域”:如果每个对象都保存在其自己的封装函数中(每个对象的save()启动其自己的连接,SQL命令,执行Begin / commit,执行并关闭SQL命令对象) **

  • 我不想为每个父/子模式编写一个特定的存储过程(即,对于父/子对象的每个变体都有一个存储过程。

    ] >><< >
  • 如果必须编写分阶段的事务,是否应该使用“ Sql SavePoints”?为什么/为什么不呢?我猜好像没有任何错误,我正在回滚整个事情。

  • 如果需要“链接”这些父对象保存的链,我可以传递一个连接对象。

  • 我正在用C#开发一些商业软件对象。每个对象都具有将自身保存到关联数据库的能力,例如(每个对象):public void Save(){//收集对象属性和...

我会重载Save并使其成为函数:
public bool Save() { //Open SqlConnection //Begin Transaction bool success = Save(cn, Trans); if (success) { //Commit return true; } else { //Rollback return false; } } public bool Save(SqlConnection cn, SqlTransaction trans) { //Save self using cn and trans. If fails, immediately return false. //Save each child using Save(cn, trans). If any one fails, immediately return false. //If no failures, return true. }

当您要保存对象时,调用Save()(无参数)。

Save()将创建一个新的连接和事务,然后调用Save(SqlConnection cn, SqlTransaction trans),它将尝试使用刚刚创建的连接和事务来保存对象。然后,Save(SqlConnection cn, SqlTransaction trans)将在所有子对象上递归调用自身,直到从上到下保存所有内容。

[如果在任何时候发生任何故障,Save(SqlConnection cn, SqlTransaction trans)将一直返回false,将调用堆栈一直备份到初始Save(),这将启动回滚。如果没有失败,它将返回true,这将触发提交。

c# sql-server parent-child transactionscope
1个回答
0
投票
© www.soinside.com 2019 - 2024. All rights reserved.