我正在用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()调用都是针对该对象/数据库类型的特定存储过程。
- 最重要的是:如果有任何子对象保存失败,我希望整个保存回滚。
例如:
最佳方法是什么?
我想将保存的逻辑(参数格式化,执行和回滚)封装在每个对象中,即
喜欢此:
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
,这将触发提交。