使用Visual Studio 2013, VB。. NET w/SQL Server(2008年以后的各种版本)
在我的VB。我已经创建了类来表示我项目中的主要实体-例如,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"对象来执行它们的任务。
我试过在写之前使用临时数据表来保存我的数据,但我遇到了违反PK的问题。系统的容量可能非常大,在进程完成之前,用户在受影响的表中插入一条新记录是很常见的。
是否有更好的方法来确保我所有的类使用相同的事务?
你可以遵循'singleton'模式来确保所有类只能访问事务的一个静态实例。
如果你有多种类型的事务被完全封装,并且不会在其他事务中创建pk违规,如果它们同时运行,你可以按照单例模式创建多种类型的对象。例如:SalesOrderTransaction, PurchaseOrderTransaction等
vb中的单例模式