關於dapper的事務處理


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;
        }

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM