3

これを解決する方法がよくわからないという問題があり、このタスクを達成するために検討すべき最善のアプローチを知りたいです。

VB.net 2.0 と SQL 2005 のアプリケーションを開発しています。ユーザーは、多数の受信商品を含む購入に基づいて、受信をキャンセルすることができます。ただし、キャンセルの過程で、「Good #1 をキャンセルしますか」などの質問がユーザーに尋ねられます。はいの場合、削除します。続いて「Good #2 キャンセルしますか?」「いいえ、削除しないでください」と別の質問(受け取ったアイテムを発行する場合は、ユーザーが手動で処理する必要があります)。そして、最後に全ての商品のキャンセルが成功した場合は、受付自体をキャンセルしなければなりません。しかし、この過程でエラーが発生したり、何らかの条件がユーザーに要求された場合、最初から行ったアクションをキャンセルして元の状態に戻したい場合があります。そこで私は考えましTransactionた。

  1. 使用できるSQL用トランザクションがあることは知っており、その使用方法も十分に知っていますが、ユーザーがこのトランザクションをキャンセルする可能性のあるアクションを実行する必要があるため、これを実際に使用することはできません.

  2. また、同様のことを実現できる.NET 2.X以降のTransactionScopeを思い出し、その使用方法も知っています。この問題は、TransactionScope と MSDTC で発生します。これを使用すると、次のようなエラーが引き続き発生します。

分散トランザクション マネージャー (MSDTC) のネットワーク アクセスが無効になっています。コンポーネント サービス管理ツールを使用して、MSDTC のセキュリティ構成でネットワーク アクセスに対して DTC を有効にしてください。

ここで説明されていることを別のスタック投稿で試してみましたが、うまく機能します...ユーザーがコンピューターを再起動するまで。ユーザーがコンピュータを再起動するたびに、価値を取り戻す必要があります。さらに、デフォルトでは、この値がオンに設定されているコンピューターはありません。少なくとも 10 台のコンピューター ベースでは、アクティブ化されたものはありませんでした。このプログラムがインストールされているコンピューターは 300 台ほどあるので、どちらも考慮しないのは良いことではありません。

では、どうすればこれを達成できるか考えている人はいますか? 私が使用できるコードを介してトランザクションを行うものは他にありますか?

1:最初にユーザーに条件を尋ね、値をメモリに保持すると言う人もいると思います。完了したら、すべてがうまくいった場合は、削除します。しかし、たとえば商品 #4 を削除するときにエラーが発生した場合はどうなるでしょうか。また、削除する商品の動的リストをストア プロシージャに与えるにはどうすればよいでしょうか。

注 2 : 私の英語で申し訳ありませんが、私は通常フランス語を話します。

注3:私はVBとC#の両方を知っているので、C#の例も提供できます。

4

1 に答える 1

1

キャンセルを管理する同様のストアド プロシージャが既にあると仮定します。

create proc CancelGood (@goodID int)
as
   SET NOCOUNT ON
   SET XACT_ABORT ON

   begin transaction

   update table1 set canceled = 1
    where GoodID = @GoodID

   update table2 set on_stock = on_stock + 1
    where GoodID = @GoodID

   commit transaction

canceledGoodsユーザーが「Oui」を選択すると、VB コードがリストに文字列を追加します。私は VB.Net に詳しくありません。c# では次のようになります。

canceledGoods.Add (string.Format("exec dbo.CancelGood {0}", goodID));

さらに、CancelledGoods に少なくとも 1 つの文字列がある場合は、バッチをビルドして実行します。

batch = "BEGIN TRANSACTION" +
        " BEGIN TRY " +
        string.Join (Environment.NewLine, canceledGoods.ToArray()) + 
        " END TRY" +
        " BEGIN CATCH " +
        " -- CODE TO CALL IF THERE WAS AN ERROR" +
        "    ROLLBACK TRANSACTION" +
        "    RETURN" +
        " END CATCH" +
        " -- CODE TO CALL AFTER SUCCESSFULL CANCELATION OF ALL GOODS" +
        " COMMIT TRANSACTION"

conn.ExecuteNonQuery (batch);
于 2012-05-04T17:45:50.947 に答える