提供支援事務的基類 `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...