首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> .NET 網頁程式設計 >> ASP.NET 基礎 >> 關於ASP.NET

分頁解決方案:資料存取函數庫 (DAL) 實戰範例——交易控制與錯誤處理

     編輯:關於ASP.NET

本文展示自訂資料存取函數庫 (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} 影響列數異常");
    }
}

關鍵交易行為總結

重要限制

  • 不支援巢狀交易:TranBegin 不可在交易中再次呼叫。
  • 交易範圍:同一 DataAccess 實例內共用連線與交易。
  • 連線管理:DAL 內部自動開啟/關閉連線,交易期間保持連線開啟。

擴充建議

  • 實作 IDisposable,Dispose 時若有未提交交易自動回滾。
  • 支援參數化查詢 (ExecuteNonQuery(sql, params)) 防 SQL 注入。
  • 整合記錄器 (Log4Net/Serilog) 記錄 SQL、參數、耗時、錯誤堆疊。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved
情境DAL 內部行為外部需處理
ExecuteNonQuery 拋出例外自動回滾交易捕獲例外、顯示錯誤、不需再呼叫 RollBack
無例外但 ExecuteRowCount 異常不自動回滾必須呼叫 TranRollBack()
所有操作正常無動作呼叫 TranCommit() 提交