2011-05-17 7 views
0

プロセス中にストアドプロシージャの1つが失敗した場合、どのようにすべてのデータをロールバックできますか。ストアドプロードの1つが見つかったときにデータロールバックが発生しました。C#

例:

protected void btnSave_Click(object sender, EventArgs e) 
    { 
     int ixTest= SaveTest("123"); 
     CreateTest(ixTest); 

    } 

    protected int SaveTest(int ixTestID) 
    { 
     SubSonic.StoredProcedure sp = Db.SPs.TestInsert(
     null, 
     ixTestID); 
     sp.Execute(); 
     int ixTest= (int)sp.OutputValues[0]; 
     return ixTest; 
    } 


    private long CreateTest(int ixTest) 
    { 
     long ixTestCustomer = CreateTestCustomer(); 

     TestCustomer testCustomer= new TestCustomer(); 
     try 
     { 
      testCustomer.TestCustomerId = ixTest; 
      testCustomer.InteractionId = ixTestCustomer ; 
      testCustomer.Save(); 
     } 
     catch 
     { 
      Response.Redirect("pgCallSaveFailure.aspx"); 
     } 

     m_saleDetail = new TestSaleDetail(); 
     try 
     { 
      m_saleDetail.SaleId = sale.SaleId; 
      m_saleDetail.Save(); 
     } 
     catch 
     { 
      Response.Redirect("pgCallSaveFailure.aspx"); 
     } 

     return ixTestCustomer ; 
    } 

私はbtnSave_Clickに呼び出す次のコードを持って、それがデータベースにデータを保存するために、別の2機能Savetest()とCreateTest()を呼び出します。 CreateTest()で問題が発生し、Savetest()が正常に実行された場合は、次のコードですべてのデータトランザクションをロールバックする方法を教えてください。 Savetest()とCreateTest()の両方のデータをすべてロールバックするにはどうすればよいですか?

TransactionScope

答えて

2

クラス

+0

フレームワークのバージョンの制約はありますか? –

0

コードが正確な実行使用が以下に与えられます。あなたはアイデアを得ることができるといいですね。

public void SaveData() 
{ 
SqlConnection connDB = new SqlConnection(); 
SqlCommand cmdExecuting = new SqlCommand(); 


try { 
    connDB = new SqlConnection(connection_string); 
    cmdExecuting.Connection = connDB; 
    connDB.Open(); 
    cmdExecuting.Transaction = connDB.BeginTransaction(); 


    int result = 0; 

    result = Method1(cmdExecuting); 

    if (result != 0) { 
     cmdExecuting.Transaction.Rollback(); 
     return; 
    } 

    result = Method2(cmdExecuting); 

    if (result != 0) { 
     cmdExecuting.Transaction.Rollback(); 
     return; 
    } 

    cmdExecuting.Transaction.Commit(); 

} catch (Exception ex) { 
    cmdExecuting.Transaction.Rollback(); 
} finally { 
    cmdExecuting.Dispose(); 
    cmdExecuting = null; 
    connDB.Close(); 
    connDB = null; 
} 


} 

public int Method1(SqlCommand cmdExecuting) 
{ 

cmdExecuting.Parameters.Clear(); 
cmdExecuting.CommandText = "stored proc 01"; 
cmdExecuting.CommandType = CommandType.StoredProcedure; 

cmdExecuting.Parameters.Add("@para1", SqlDbType.Int); 
cmdExecuting.Parameters("@para1").Value = value; 

return cmdExecuting.ExecuteScalar(); 

} 


public int Method2(SqlCommand cmdExecuting) 
{ 

cmdExecuting.Parameters.Clear(); 
cmdExecuting.CommandText = "stored proc 02"; 
cmdExecuting.CommandType = CommandType.StoredProcedure; 

cmdExecuting.Parameters.Add("@para1", SqlDbType.Int); 
cmdExecuting.Parameters("@para1").Value = value; 

return cmdExecuting.ExecuteScalar(); 

} 
関連する問題