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

C# 委托實現 AOP 事務(二):基類 SqlDAL 完整實現

     編輯:關於C語言

提供支援事務的基類 `SqlDAL` 完整代碼,含連接管理、多重 `ExecuteNonQuery` 重載、事務執行器。

核心代碼結構

public class SqlDAL {
    #region 事務與連接
    private SqlTransaction _sqlTrans;
    private SqlConnectionStringBuilder _connStr;
    #endregion

    #region 委托定義
    public delegate void VoidDictionaryMethod(Dictionary<string, object> dict);
    #endregion

    #region ExecuteNonQuery 重載
    public int ExecuteNonQuery(string cmdText) { ... }
    public int ExecuteNonQuery(string cmdText, CommandType type) { ... }
    public int ExecuteNonQuery(string cmdText, CommandType type, params SqlParameter[] pars) { ... }
    // 內部自動判斷 _sqlTrans 是否為 null,決定用連接還是事務執行
    #endregion

    #region 事務執行器
    public void TransactionAction(Delegate action, params object[] args) {
        using (var conn = new SqlConnection(ConnectionString.ConnectionString)) {
            conn.Open();
            _sqlTrans = conn.BeginTransaction();
            try {
                action.DynamicInvoke(args);
                _sqlTrans.Commit();
            } catch (SqlException) {
                _sqlTrans.Rollback();
            } finally {
                _sqlTrans?.Dispose();
                _sqlTrans = null;
                conn.Close();
            }
        }
    }
    #endregion

    #region 屬性
    public SqlTransaction SqlTrans { get; set; }
    public virtual SqlConnectionStringBuilder ConnectionString { ... }
    #endregion
}

測試輸出

Test
-------------------------------
DelegateMethod Start...
Test
DelegateMethod End...

設計說明

  • `DynamicInvoke` 支援任意委托簽名,`params object[]` 傳遞參數
  • 事務範圍內所有 `ExecuteNonQuery` 自動使用 `_sqlTrans`
  • 屬性 `ConnectionString` 延遲初始化,支援覆寫
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved