【发布时间】:2017-03-20 18:22:44
【问题描述】:
使用 Visual Studio 2013、VB.NET w/SQL Server(2008 年以后的各种版本)
在我的 VB.NET 项目中,我创建了代表项目中主要实体的类 - 例如,cSalesOrder、cSalesOrderDetail、cPacklist 等。每个类都包含执行基本任务的各种方法,例如保存、更新、加载等。
在我最近的项目中,我必须确保所有进程在保存之前都成功,所以我使用的是 SQL 事务。我的问题是如何最好地处理管理自己的数据流程的多个对象之间的这些事务。
这就是我现在正在做的事情。当我需要启动进程时,我使用这样的代码块来创建我的 Connection、Transaction 和 Command 对象:
Using con As New SQLConnection(MyConnectString)
con.Open
Using trn As SQLTransaction = trn.BeginTransaction
Using cmd As New SQLCommand
cmd.Connection = con
cmd.Transaction = trn
<code here>
End Using
End Using
End Using
(In the <code here> section I would create my objects and run the process.)
在每个类中,我都声明了一个“cmd”对象。例如,在我的 cSalesOrder 类中,我有这一行:
Dim cmd As SQLCommand
然后当我实例化该类时,我传入我在上面的块中创建的 cmd 对象:
Dim so As New cSalesOrder
so.cmd = cmd
so.Load
然后我班级中的各种方法使用该“cmd”对象来执行它们的任务。
我尝试在写入之前使用临时 DataTables 来保存我的数据,但我遇到了 PK 违规问题。这些系统的容量可能非常大,在我的流程完成之前,用户在其中一个受影响的表中插入一条新记录并不少见。
有没有更好的方法来确保我的所有类都使用相同的事务?
【问题讨论】:
-
IMO,命令对象不属于您的类。将您的业务逻辑包装在
TransactionScope中。研究工作单元 (UoW) 模式。 -
TransactionScope 是票。它非常易于使用,并且可以完美地封装业务逻辑。
标签: sql vb.net class transactions