dapper:一個輕量級的ORM框架
dapper事務處理的注意點:1、使用同一個Connection 2、使用同一個Transaction
為了方便調用,自己編寫了一個DapperHelper.cs
代碼如下:
using Dapper; using Model.DB; using MySql.Data.MySqlClient; using System; using System.Collections.Generic; using System.Data; using System.Data.Common; namespace Tools.DB { public class DapperHelper { private static DapperHelper dapperHelper; private static readonly object lockObj = new object(); public static string connStr = string.Empty; private DapperHelper() { //數據庫連接字符串 connStr = Conn.CreateInstance().ConnStr; } public static DapperHelper CreateDapperHelper() { if (dapperHelper == null) { lock (lockObj) { if (dapperHelper == null) { dapperHelper = new DapperHelper(); } } } return dapperHelper; } /// <summary> /// 增刪改 /// </summary> /// <typeparam name="T">數據類型 content可以是一個對象也可以是一個集合</typeparam> /// <param name="sql"></param> /// <param name="obj"></param> /// <returns></returns> public int ExecuteNonQuery<T>(string sql, T obj) { int result = 0; try { using (var conn = new MySqlConnection(connStr)) { result = conn.Execute(sql, obj); } } catch { } return result; } /// <summary> /// 增刪改 /// </summary> /// <typeparam name="T">數據類型 content可以是一個對象也可以是一個集合</typeparam> /// <param name="sql"></param> /// <param name="obj"></param> /// <returns></returns> public int ExecuteNonQuery<T>(string sql, T obj, IDbTransaction tran, IDbConnection conn) { int result = 0; try { result = conn.Execute(sql, obj, tran); } catch { //回滾事務並銷毀連接對象 Rollback(tran,conn); DisposeConn(conn); return -1; } return result; } /// <summary> /// 返回首行首列 /// </summary> /// <param name="sql"></param> /// <param name="obj"></param> /// <returns></returns> public object ExecuteScalar(string sql, object obj = null) { object result; using (var conn = new MySqlConnection(connStr)) { result = conn.ExecuteScalar(sql, obj); } return result; } /// <summary> /// 查詢單條記錄 /// </summary> /// <typeparam name="T"></typeparam> /// <param name="sql"></param> /// <param name="obj">new{...}</param> /// <returns></returns> public T ExecuteQuery<T>(string sql, object obj = null) { T result; using (var conn = new MySqlConnection(connStr)) { result = conn.QueryFirstOrDefault<T>(sql, obj); } return result; } /// <summary> /// 使用事務查詢單條記錄 /// </summary> /// <typeparam name="T"></typeparam> /// <param name="sql"></param> /// <param name="obj">new{...}</param> /// <returns></returns> public T ExecuteQuery<T>(string sql, IDbTransaction tran, IDbConnection conn, object obj = null) { T result; result = conn.QueryFirstOrDefault<T>(sql, obj, tran); return result; } /// <summary> /// 查詢多條記錄 /// </summary> /// <typeparam name="T"></typeparam> /// <param name="sql"></param> /// <param name="obj">new{...}</param> /// <returns></returns> public IEnumerable<T> ExecuteQuerys<T>(string sql, object obj = null) { IEnumerable<T> result; using (var conn = new MySqlConnection(connStr)) { result = conn.Query<T>(sql, obj); } return result; } /// <summary> /// 使用事務查詢多條記錄 /// </summary> /// <typeparam name="T"></typeparam> /// <param name="sql"></param> /// <param name="obj">new{...}</param> /// <returns></returns> public IEnumerable<T> ExecuteQuerys<T>(string sql, IDbTransaction tran, IDbConnection conn, object obj = null) { IEnumerable<T> result; result = conn.Query<T>(sql, obj,tran); return result; } /// <summary> /// 獲得conn對象 /// </summary> /// <returns></returns> public IDbConnection GetConn() { var conn = new MySqlConnection(connStr); return conn; } /// <summary> /// 打開conn /// </summary> /// <param name="conn"></param> public void OpenConn(IDbConnection conn) { conn.Open(); } /// <summary> /// 銷毀conn /// </summary> /// <param name="conn"></param> public void DisposeConn(IDbConnection conn) { conn.Dispose(); conn.Close(); } /// <summary> /// 開啟事務 /// </summary> /// <param name="conn"></param> /// <returns></returns> public IDbTransaction BeginTransaction(IDbConnection conn) { IDbTransaction tran = conn.BeginTransaction(); return tran; } /// <summary> /// 提交事務 /// </summary> /// <param name="tran"></param> /// <param name="conn"></param> public void Commit(IDbTransaction tran, IDbConnection conn) { tran.Commit(); } /// <summary> /// 回滾事務 /// </summary> /// <param name="tran"></param> /// <param name="conn"></param> public void Rollback(IDbTransaction tran, IDbConnection conn) { tran.Rollback(); } } }
針對此類的事務編寫如下:
private int SetConAct(List<ConAct> conActs) { //創建數據庫連接對象 IDbConnection conn = dapper.GetConn(); using (conn) { //打開連接 dapper.OpenConn(conn); //開啟事務 IDbTransaction tran = dapper.BeginTransaction(conn); //事務中需要執行的代碼 IEnumerable<DBController> cons = GetCons(conn, tran); foreach (var conAct in conActs) { string conId; if (cons == null || cons.Where(c => c.name == conAct.ConName).Count() < 1) { conId = Guid.NewGuid().ToString(); string sql1 = "insert into controller (id, name, create_tm ) values (@id, @name, now()) "; int rs1 = dapper.ExecuteNonQuery(sql1, new { id = conId, name = conAct.ConName }, tran, conn); } else { conId = cons.Where(c => c.name == conAct.ConName).FirstOrDefault().id; } if (conAct.ActNames != null) { IEnumerable<DBAction> acts = GetAct(conn, tran, conId); foreach (var actName in conAct.ActNames) { string actId; if (acts == null || acts.Where(c => c.name == actName).Count() < 1) { actId = Guid.NewGuid().ToString(); string sql2 = @"insert into action (id, name, controller_id, create_tm) values (@id, @name, @controller_id, now())"; int rs2 = dapper.ExecuteNonQuery(sql2, new { id = actId, name = actName, controller_id = conId }, tran, conn); } } } } //提交事務 dapper.Commit(tran, conn); } return 0; }
