摘要:在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