簡體   English   中英

如何在.net C#中的數據庫對象中應用事務回滾

[英]How to apply transaction roll back in database object in .net c#

有誰知道如何在.net c#中的數據庫對象中應用事務回滾?

示例:本來我有以下代碼:

   protected void btnSave_Click(object sender, EventArgs e)
   {
      try {
         m_test = CreateTest();
      } catch{}
   }


   private Db.Test CreateTest()
   {
           var test= new Test();
           test.Title = sTitle.SelectedValue;
           test.FirstName = sFirstName.Text;
           test.LastName = sLastName.Text;
           test.PhoneHome = sHomePhone.Text;
           test.PhoneWork = sWorkPhone.Text;
           test.PhoneMobile = sMobile.Text;
           test.EmailAddress = sEmail.Text;
           test.Save();

           return test;
   }

然后,我嘗試將事務回滾操作應用到代碼中,並在其中應用以下代碼...然后,我將其堆疊在CreateTest方法下。 我不知道如何為數據庫對象應用代碼

       protected void btnSave_Click(object sender, EventArgs e)
       {

          SqlConnection connDB = new SqlConnection();
          SqlCommand cmdExecuting = new SqlCommand();

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

             m_test = CreateTest(cmdExecuting);

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


   private Db.Test CreateTest(SqlCommand  cmdExecuting)
   {
           var test= new Test();
           test.Title = sTitle.SelectedValue;
           test.FirstName = sFirstName.Text;
           test.LastName = sLastName.Text;
           test.PhoneHome = sHomePhone.Text;
           test.PhoneWork = sWorkPhone.Text;
           test.PhoneMobile = sMobile.Text;
           test.EmailAddress = sEmail.Text;
           test.Save();

           return test;
   }

有誰知道在這種情況下如何在CreateTest()中進行編碼?

看一下TransactionScope類,它提供了許多好處,包括

  • 范圍內建立的連接的自動事務登記
  • 發生異常時自動回滾事務
  • 我認為這也使代碼更加清晰易讀,因為它減少了所需的代碼量

try    
{   
    using (TransactionScope scope = new TransactionScope())     
    {                                   
        m_test = CreateTest();          
        scope.Complete(); // Commit transaction     
    }    
}    
catch (Exception ex)    
{
    // Transaction is automatically rolled back
}

另外,請參閱.NET Framework 2.0中的介紹System.Transactions一文作為一個很好的起點。

您可以采取以下措施,不需要在后端進行事務處理,后端sqltransaction對象會處理該事務。 您可以將此代碼放在自己的事件中,無論哪個事件負責將數據插入數據庫中

 protected void Button1_Click(object sender, EventArgs e)
    {
      SqlConnection myConnection = new SqlConnection("Data Source=localhost;Initial Catalog=Northwind;uid=sa;pwd=sa;");
      myConnection.Open();

      // Start a local transaction
      SqlTransaction myTrans = myConnection.BeginTransaction();

      SqlCommand myCommand = new SqlCommand();
      myCommand.Connection = myConnection;
      myCommand.Transaction = myTrans;
      try
      {
        myCommand.CommandText = "Insert into Region (RegionID, RegionDescription) VALUES (100, 'Description')";
        myCommand.ExecuteNonQuery();
        myCommand.CommandText = "delete * from Region where RegionID=101";

        // Attempt to commit the transaction. 
        myCommand.ExecuteNonQuery();
        myTrans.Commit();
        Response.Write("Both records are written to database.");
      }
      catch (Exception ep)
      {
        // Attempt to roll back the transaction. 
        myTrans.Rollback();
        Response.Write(ep.ToString());
        Response.Write("Neither record was written to database.");
      }
      finally
      {
        myConnection.Close();
      }
    }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM