我有一种情况,我需要从一个表单(Form1)向数据库插入一条记录,然后打开另一个表单(Form2),在该表单中,我必须向DB添加更多详细信息,并在返回到Form1时需要添加更多详细信息。最后,我必须从(From1)打开另一个窗体(Form3),在其中必须添加其他详细信息。
我的要求是,如果Form2或Form3中有任何故障,则应取消整个过程。因此,应以所有形式回滚到数据库的所有插入。我尝试在每种表单中使用TransactionScopeOption.Required来实现TransactionScope,但这似乎无法按我需要的方式工作。就我而言,如果Form3出现故障,则Form2中的插入不会回滚(我想是因为在每个作用域上都调用了scope.Complete())。
所需方案:
如果您不发布代码,则很难给出具体建议。
不过,原则上,数据库方面的要求是能够提交事务并保持选择状态以改变主意,以防万一您决定稍后回滚。不可能。
Complete()仅应调用一次。
要在表单之间提交数据,请考虑使用临时表,并在完成后在Form1中将它们拉在一起;否则,TransactionScope必须由Form1获取,在对Forms2&3的调用过程中保持不完整,并在最后调用Complete()d。
运气
PS:@ pinkfloydx33关于在表单之间维护本地容器的评论建议非常好(比DB调用性能更好,无需清除)。