2013-03-07 79 views
2

我正在處理sql,我的查詢是,我有一些方法,我在做不同的任務。例如: - 第一個方法 - 插入 第二方法 - 更新用 第三屆方法 - 刪除 4 methos - 插入如何實現交易?

現在我想執行所有這些的一次。但如果發生任何錯誤,那麼整個過程會自行回滾。

代碼:

private void btnSubmit_Click(object sender, EventArgs e) 
{ 
    DialogResult dr = MessageBox.Show("Are you sure you want to submit the information? Click 'Yes' to Submit or 'No' to re-Check.", "eParty - Confirmation", MessageBoxButtons.YesNo, MessageBoxIcon.Information); 
    if (dr == DialogResult.Yes) 
    { 
     this.Cursor = Cursors.WaitCursor; 

     INSERT(); 
     UPDATE(); 
     DELETE(); 
     INSERTAGAIN(); 

     MessageBox.Show("Booked successfully.", "eParty - Done!", MessageBoxButtons.OK, MessageBoxIcon.Information); 
     this.Cursor = Cursors.Default; 

     this.Cursor = Cursors.WaitCursor; 

     this.Close(); 
    } 
    else 
    { 

    } 
} 

現在如何落實 'btnSubmit_Click' 的方法交易...

回答

0

這取決於你所擁有的數據庫訪問技術。

如果您使用實體框架,SaveChanges()方法已具有事務支持。

在純ADO.NET的情況下,請參閱本https://stackoverflow.com/a/224702/210994

0

您可以使用ADO記錄和發送您的交易作爲一個參數去所有的方法

SqlConnection db = new SqlConnection("connstringhere"); 
SqlTransaction transaction; 
db.Open(); 
transaction = db.BeginTransaction(); 
try 
{ 
    INSERT(transaction); 
    UPDATE(transaction); 
    DELETE(transaction); 
    INSERT(transaction); 
    transaction.Commit(); 
} 
catch (SqlException sqlError) 
{ 
    transaction.Rollback(); 
} 
+0

先生,我來實現你的代碼,但我不知道如何讓我的方法退貨。你能告訴我,我所有的方法應該做什麼改變。我用這: 公共無效INSERT(){ // 代碼 } – 2013-03-14 06:21:57

+0

@SandeepKumarThenua嗨。您可以使用SqlCommand.ExecuteNonQuery,它返回您的查詢所做的受影響行數。所以如果它是-1,那麼就拋出SqlExecption。另一種方法是爲您的服務器捕獲@@錯誤,並在您的代碼中處理它。或者你可以返回方法中受影響的行數:public long INSERT(){//代碼;返回SqlCommand.ExecuteNonQuery(); },如果它是-1,則進行回滾 – Alex 2013-03-14 07:13:00

0

請參閱本主題:Implementing an Implicit Transaction using Transaction Scope

TransactionScope類提供了一種簡單的方式來標記的 代碼參與事務塊,而不需要您 與交易本身進行互動。交易範圍可以選擇 並自動管理環境交易。由於其易用性和效率,因此建議您在開發事務應用程序時使用TransactionScope類 。在 另外,您不需要明確地使用 交易徵募資源。任何System.Transactions資源管理器(如SQL Server 2005)都可以檢測由作用域創建並自動登記的環境事務 的存在。

我也想推薦你讀這question和它的答案。它涉及有關通過多個連接使用事務的有趣主題。

0

通常是這樣的:

void DoStuff(args) 
{ 
    using (var conn = CreateOpenConnection()) 
    using (var tran = conn.BeginTransaction()) 
    { 
     try 
     { 
      // various operations here 
      ForExample(conn, tran); 
      tran.Commit(); 
     } 
     catch 
     { 
      tran.Rollback(); 
      throw; 
     } 
    } 
} 

void ForExample(DbConnection conn, DbTransaction tran = null) 
{ 
    using (var cmd = conn.CreateCommand()) 
    { 
     cmd.Transaction = tran; 
     cmd.CommandText = "For example"; 
     // cmd.Parameters.Add(...) 
     cmd.ExecuteNonQuery(); 
    } 
} 

雖然大多數的這個可以使用任何工具/庫可用坐上面的原料ADO.NET的減少。

0

也許你應該創建一個存儲過程並根據參數執行你的CRUD操作。例如:

BEGIN TRANSACTION 

    IF(@PartyID <= 0) 
    BEGIN 
     //INSERT 
    IF @@ERROR <> 0 
     BEGIN 
      ROLLBACK TRANSACTION 
      RETURN 
     END 
    END 
    ELSE 
    BEGIN 
     //UPDATE 
    IF @@ERROR <> 0 
     BEGIN 
      ROLLBACK TRANSACTION 
      RETURN 
     END 
    END 
2

試試這個:

using(var scope = new TransactionScope()) 
    { 
    INSERT(); 
    UPDATE(); 
    DELETE(); 
    INSERTAGAIN(); 

    scope.Complete(); //if we make it here - commit the changes, 
         //if not - everything is rolled back 

    } 

記住,包括System.Transactions到你的項目