、VB.NETは、SQL Server/W(前進2008年から様々なバージョン)SQLトランザクションを複数のクラスのvb.net
例えば、cSalesOrder、cSalesOrderDetail、cPacklistなどです。これらのクラスには、Save、Update、Loadなどの基本的なタスクを実行するさまざまなメソッドがあります。
最近のプロジェクトでは、すべてのプロセス保存前に成功したので、SQLトランザクションを使用しています。私の質問は、独自のデータプロセスを管理する複数のオブジェクト間でそれらのトランザクションをどのように最もうまく処理するかです。
ここは私が今やっていることです。私は、プロセスをオフに解雇する必要があるとき、私は私の接続、トランザクション、および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」オブジェクトを宣言しました。その後、様々な
Dim so As New cSalesOrder
so.cmd = cmd
so.Load
:Iインスタンスそのクラスは、私は上記のブロックで作成されたCMDオブジェクトを渡すときに
Dim cmd As SQLCommand
そして:たとえば、私のcSalesOrderクラスで私はこのラインを持っています私のクラスのメソッドは、 "cmd"オブジェクトを使ってタスクを実行します。
私は一時的なデータテーブルを使用して書き込み前にデータを保持しようとしましたが、PK違反の問題が発生しました。システムは非常に大量になる可能性があり、プロセスが完了する前に、影響を受けるテーブルの1つに新しいレコードを挿入することは珍しいことではありません。
すべてのクラスが同じトランザクションを使用するようにするには、これを行うより良い方法がありますか?
IMO、コマンドオブジェクトは、あなたのクラスに属していません。 TransactionScopeでビジネスロジックをラップします。作業単位(UoW)のパターンを研究する。 – Crowcoder
TransactionScopeがチケットでした。これは非常に使いやすく、ビジネスロジックをカプセル化するために完全に機能します。 –