2016-11-07 9 views
3

、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つに新しいレコードを挿入することは珍しいことではありません。

すべてのクラスが同じトランザクションを使用するようにするには、これを行うより良い方法がありますか?

+1

IMO、コマンドオブジェクトは、あなたのクラスに属していません。 TransactionScopeでビジネスロジックをラップします。作業単位(UoW)のパターンを研究する。 – Crowcoder

+0

TransactionScopeがチケットでした。これは非常に使いやすく、ビジネスロジックをカプセル化するために完全に機能します。 –

答えて

0

「シングルトン」パターンに従うことで、すべてのクラスがトランザクションの1つの静的インスタンスにしかアクセスできないようにすることができます。

完全にカプセル化され、同時に実行された場合に他のトランザクションでpk違反を作成しない複数のタイプのトランザクションがある場合は、シングルトンパターンに従って複数のタイプのオブジェクトを作成できます。例えば:などSalesOrderTransaction、PurchaseOrderTransaction、

singleton pattern in vb

関連する問題