2012-05-04 8 views
3

私はこの問題を解決する方法が不明で、問題を抱えており、このタスクを達成するために何が最善のアプローチであるかを知りたいと思っています。私たちは、アプリケーションの研究開発をしているトランザクションのコード内

VB.net 2.0とSQL 2005ユーザーがかもしれないが、多く受け取った商品が含まれているの購入に基づいて受信をキャンセルさせています。しかし、取り消しの過程で、「良い#1をキャンセルしますか?」などの質問がユーザーに表示されます。はいの場合は削除します。次に、「良い#2をキャンセルしますか?」、いいえ、削除しないでください(受信したアイテムが発行されている場合は、ユーザーが手動でプロセスを作成する必要があります)。そして最後に、すべての商品がであった場合、がキャンセルされた場合は、受け取りをキャンセルする必要があります。しかし、エラーが発生したり、このプロセスでユーザーに要求された状態が発生した場合は、最初から行われた操作をキャンセルして元の状態に戻したいと考えています。だから、私はTransactionと思った。

  1. 私は使用することができますTransaction for SQLがある知っていると私はそれを使用する方法を十分知っているが、私は本当にユーザーとしてこれを使用することはできませんが、おそらくこの取引をキャンセルしたアクションを実行する必要があります。

  2. 私はまた、.NET 2.XからTransactionScopeを覚えていて、これと似たようなことを達成することができます。また、それを使用する方法もよく知っています。この問題はTransactionScopeとMSDTCで発生します。分散トランザクションマネージャ(MSDTC)のための

ネットワークアクセスが無効になっている。これを使用している場合、我々はまだ言ったエラーを取得します。コンポーネントサービスの管理ツールを使用して、MSDTCのセキュリティ構成でネットワークアクセス用のDTCを有効にしてください。

ここに記載されているものを試してみたところ、in another stack postは、ユーザーがコンピュータを再起動するまでうまくいきます。ユーザーは毎回コンピュータを再起動し、価値を取り戻す必要があります。加えて、デフォルトでは、この値がOnに設定されているコンピュータはありません。少なくとも10台のコンピュータベースでは、いずれも有効化されていません。このプログラムがインストールされている300台のコンピュータのようなものがありますので、どちらも考慮しないと良いことはありません。

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

NOTE1:私はいくつかのことが言えるでしょう、まずユーザーに条件を尋ね、メモリ内の値を維持します。完了したら、すべてがうまくいったら、削除してください。しかし、削除するときにエラーが発生した場合、商品#4としましょうか?そして、削除する商品の動的リストをストア・プロシージャにどのように与えることができますか?

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

注記3:私はVBとC#の両方を知っているので、C#のすべてのサンプルも提供できます。すでにキャンセルを管理するために、類似したストアドプロシージャを持っていると仮定すると

+0

をC#で、それは次のようになります。エラーが発生した場合バッチ内の自動ロールバックの詳細については、[SET XACT_ABORT ON](http://msdn.microsoft.com/en-us/library/ms188792%28v=sql.90%29.aspx)を参照してください。 –

+0

うん、しかし、私はまだ#1、3、4、5、8のGood#1をGoodから取り消すことができるという問題があります。動的配列をストアドプロシージャに渡すにはどうすればよいですか?方法はありますか? –

+0

SQL ServerにXMLデータ型があるので、XMLパラメータとしてあらゆる種類のものを渡す可能性があります。しかし、私はあなたがユーザーのアクションとこのバッチのExecuteNonQueryに応答してSQLステートメントを自分で作成できると考えていました。 –

答えて

1

:ユーザーが「OUIは」選択した場合

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 

VBのコードは、いくつかのcanceledGoodsリストに文字列を追加します。私はVBに慣れていない。ネット; canceledGoodsに少なくとも1つの文字列がある場合は、バッチビルドと実行、

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

より:embeddトランザクションおよびロールバックに削除されます、あなたは注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); 
+0

これはC#では大丈夫ですが、私はこのプロジェクトの前にC#だけを使っていましたので、私は両方ともfamilarです。あなたが書いたことを試してみて、後で戻ってきます。しかし、私の問題のほんの一部しか説明していないので、私の側には確かに多くの仕事があります。私はこれらの方法を使ってこれを行う方法に戻って考えてみる必要があります。たぶん、私は.NETコードをSQLと比較して慣れているので、おそらくもっと簡単に2番目の部分を使用するでしょう。 –

関連する問題