本文展示自訂資料存取函數庫 (DataAccessLibrary) 的核心用法:無交易刪除、有交易批次刪除、錯誤訊息處理、影響列數檢查,強調交易邊界與自動/手動回滾機制。
public class DataAccess
{
public string ErrorMessage { get; } // 最近一次操作錯誤訊息
public int ExecuteRowCount { get; } // 最近一次非查詢影響列數
public TransactionManager TranManager { get; } // 交易管理器
public int ExecuteNonQuery(string sql); // 執行 INSERT/UPDATE/DELETE
public DataTable ExecuteDataTable(string sql); // 查詢
}
protected void Btn_Del_Click(object sender, EventArgs e)
{
string sql = "DELETE FROM News_NewsInfo WHERE NewsID = 18";
dal.ExecuteNonQuery(sql);
#region 錯誤與影響列數檢查
if (dal.ErrorMessage.Length > 0)
{
Functions.PageRegisterAlert(Page, "刪除發生異常,請聯繫管理員!");
return;
}
if (dal.ExecuteRowCount != 1)
{
Functions.PageRegisterAlert(Page, "未正確刪除資料,請聯繫管理員!");
return;
}
#endregion
}
protected void Btn_DelMore_Click(object sender, EventArgs e)
{
dal.TranManager.TranBegin(); // 開啟交易
try
{
// 刪除第一筆
dal.ExecuteNonQuery("DELETE FROM News_NewsInfo WHERE NewsID = 13");
CheckResult("第一筆");
// 刪除第二筆
dal.ExecuteNonQuery("DELETE FROM News_NewsInfo WHERE NewsID = 14");
CheckResult("第二筆");
// 所有操作成功 → 提交交易
dal.TranManager.TranCommit();
}
catch
{
// 異常時 DAL 內部已自動回滾,但建議顯式處理
dal.TranManager.TranRollBack();
throw;
}
}
private void CheckResult(string label)
{
if (dal.ErrorMessage.Length > 0)
{
Functions.PageRegisterAlert(Page, $"{label} 刪除異常!");
// DAL 內部已自動回滾
throw new Exception(dal.ErrorMessage);
}
if (dal.ExecuteRowCount != 1)
{
Functions.PageRegisterAlert(Page, $"{label} 未正確刪除!");
dal.TranManager.TranRollBack(); // 無異常但列數異常,需手動回滾
throw new Exception($"{label} 影響列數異常");
}
}
| 情境 | DAL 內部行為 | 外部需處理 |
|---|---|---|
| ExecuteNonQuery 拋出例外 | 自動回滾交易 | 捕獲例外、顯示錯誤、不需再呼叫 RollBack |
| 無例外但 ExecuteRowCount 異常 | 不自動回滾 | 必須呼叫 TranRollBack() |
| 所有操作正常 | 無動作 | 呼叫 TranCommit() 提交 |