4

こんにちは、C#のトランザクションスコープは初めてです。2つの挿入クエリがあります。1つはLoginCredentialsが格納されているUserAccountCreationに属し、もう1つは外部キーとしてEmployeeテーブルのそれぞれのUserAccountIDを使用して従業員の詳細を挿入しています。

UserAccountテーブルに挿入するために作成された2つの異なるメソッドがあり、UserAccountに挿入した後、UserAccountIDがfetechedされ、Employeeテーブルに挿入されます。状況は、UserAccountの作成が成功し、Employeeの作成が失敗した場合、ロールバックする必要があります。だから、トランザクションスコープを使用できるかどうか、そしてその間にこれらの2つのInsertメソッドを呼び出すことができるかどうか知りたいですか?エラーが発生した場合、このスコープで呼び出されたこれらのメソッドをロールバックできますか。サンプルコード:

private void CreateEmp()
{
  using (TransactionScope scope = new TransactionScope())
  {
    try
    {
        CreateUserAccount();
        CreateEmployee();
        scope.Complete();
    } 
    catch (TransactionAbortedException ex)
        {

    }
  }
}

感謝します!前もって感謝します!

4

4 に答える 4

2

トランザクションスコープで必要な数の関数を呼び出すことができます。2つのメソッドが独自の接続(開く/使用/閉じる/破棄)を処理できるようにしたい場合でも、何も渡さなくても、それらはサイレントトランザクションの一部になります。

于 2012-12-18T07:15:14.820 に答える
2

これはあなたの質問に答えるはずです。ショートカットするには、コード例のコメントを読んでください

于 2012-12-18T07:16:23.683 に答える
0

はい。そのため、トランザクションスコープを使用します。

于 2012-12-18T07:18:56.607 に答える
0

手元のタスク: ユーザーが[更新]ボタンをクリックしたときに、4つのテーブルに行を挿入する必要があります。

以下は私にとってうまく機能しています:

4つの更新メソッドがあるクラスに変数を追加し、4つのメソッドのいずれかで例外がキャッチされた場合はfalseに設定しました。これなしで電話tran.Complete();をかけることは私にとってはうまくいきませんでした。

/* This variable is used to check if updating the scorecard succeeded. 
Set this variable to false in catch blocks of the 4 update methods. */

private bool bAllUpdated = true;

私の更新クリックメソッドは次のようになります。

/* Showing the try-catch block only */
try
{
    using (TransactionScope tran = new TransactionScope())
    {
         UpdateMethod1();
         UpdateMethod2();
         UpdateMethod3();
         UpdateMethod4();

         if (bAllUpdated == true)
         {
             tran.Complete();
             lblSC_Success.Visible = true;
         }
         else
             throw new TransactionAbortedException();
    }
}

catch (TransactionAbortedException ex)
{
      bAllUpdated = false;
      lblSCEditWarning.Text = "There was an error and your changes where NOT saved. " + ex.Message;
}
catch (ApplicationException ex)
{
    bAllUpdated = false;
    lblSCEditWarning.Text = "There was an error and your changes where NOT saved. " + ex.Message;
}
catch (Exception ex)
{
    bAllUpdated = false;
    lblSCEditWarning.Text = "There was an error and your changes where NOT saved. " + ex.Message;
}
finally
{
    // Clean up the temp tables
    // Refresh page
}
于 2015-11-05T17:15:10.070 に答える