在SqlDataSource更新、新增、刪除資料時,手動加入額外的SQL指令(以Transaction方式更新)

摘要:在SqlDataSource更新、新增、刪除資料時,手動加入額外的SQL指令(以Transaction方式更新)

使用時機:若 table A的更動某筆資料時,欲同時更動 table B。

table A使用GridView操作資料的更新(Update)、新增(Insert)、刪除(Delete),

在 table A更動資料的同時,手動加入更動 table B 資料的 SQL指令。

 

原理:以刪除為例→ Gridview source所配合的sqlDataSource中,刪除的事件有兩個:Deleting()與Deleted(),

Deleting()為資料刪除"前"所觸發動作,而Deleted()為資料刪除"後"所觸發動作,

我們只要在資料刪除"前"手動加入交易指令與額外的SQL指令,

若資料刪除"後"發生exception我們則作Rollback動作來確保資料表結構完整。

 

前置作業:using System.Transactions;  // 此為.Net 2.0函式庫
                   using System.Data.Common;

Step 1: 拉出GridView對 table A作binding,並啟用進階功能的更新(Update)、新增(Insert)、刪除(Delete),以下以刪除(Delete)為例。

Step 2: 於sqlDataSource加入資料刪除"前"的事件Deleting()

protected void SqlDataSource_Deleting(object sender, SqlDataSourceCommandEventArgs e)
        {            
            DbCommand cmd = e.Command;                             // 取得Command
            cmd.CommandText += "\r\n" + "額外的SQL指令";  // "\r\n"為換行, 用分號";"亦可

            DbConnection sc = cmd.Connection;                       //取得Connection
            sc.Open();
            DbTransaction myTrans = sc.BeginTransaction(); // 新增Transaction並指向資料庫連線
            cmd.Transaction = myTrans;                                      // 指定cmd的transaction為上一行的交易
        }

Step 3: 於sqlDataSource加入資料刪除"後"的事件Deleted()

protected void SqlDataSource_Deleted(object sender, SqlDataSourceStatusEventArgs e)
        {
            if (e.Exception == null)
            {
                e.Command.Transaction.Commit();                
            } // if 
            else
            {
                e.Command.Transaction.Rollback();   // commit()失敗--> rollback() 確保資料結構完整
                Response.Write( "資料更新失敗: " + e.Exception.Message );
            } // else
        }

 

Transaction配合sqlDataSource 參考資料: 「ASP.NET 4.0 專題實務[II]」 7-5章

--

不斷學習,精進自我

Herbert Fang