откат данных, когда один из сохраненных программных продуктов обнаружил сбой в .net c#

#c# #.net #web-applications #subsonic

#c# #.net #веб-приложения #дозвуковой

Вопрос:

Кто-нибудь знает, как я могу выполнить откат всех данных в .net 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 ()?

Ответ №1:

Используйте класс TransactionScope

Ответ №2:

Точный код выполнения приведен ниже. Надеюсь, вы сможете уловить идею.

 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();

}