C#操作MySql数据库帮助类(Dapper,T-Sql)

Posted 凡是过往,皆为序章。

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C#操作MySql数据库帮助类(Dapper,T-Sql)相关的知识,希望对你有一定的参考价值。

using System.Text;
using mysql.Data.MySqlClient;
using System.Data;
using Dapper;
using System.Reflection;

namespace DbHelper
{
    public class MySqlHelper
    {
        private string connectionStr = "server=localhost;database=fxy;User=root;password=cxk";
        //public object connection = GetConnection(connectionStr);


        /// <summary>
        /// Dapper查询(包含存储过程及sql语句查询)
        /// </summary>
        /// <typeparam name="T">实体类型</typeparam>
        /// <param name="sql">存储过程名称或者sql语句</param>
        /// <param name="param">参数化处理</param>
        /// <param name="isStoredProcedure">是否存储过程查询</param>
        /// <returns></returns>
        public List<T> DapperQuery<T>(string sql , object param , bool? isStoredProcedure = false) where T : new()
        {
            using(IDbConnection con = new MySqlConnection(connectionStr))
            {
                CommandType cmdType = (isStoredProcedure ?? true) ? CommandType.StoredProcedure : CommandType.Text;
                try
                {
                    List<T> queryList = con.Query<T>(sql , param , null, true , null , cmdType).ToList();
                    return queryList;
                }
                catch(Exception e)
                {
                    throw;
                }
            }
        }

        /// <summary>
        /// TSQL查询
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <param name="sql"></param>
        /// <param name="param"></param>
        /// <param name="isStoredProcedure"></param>
        /// <returns></returns>
        public List<T> TSqlQuery<T>(string sql,MySqlParameter[] param,bool? isStoredProcedure = false) where T:new()
        {
            using(MySqlConnection con = new MySqlConnection(connectionStr))
            {
                con.Open();
                CommandType cmdType = (isStoredProcedure ?? true) ? CommandType.StoredProcedure : CommandType.Text;
                MySqlCommand command = new MySqlCommand(sql , con );
                command.CommandType = cmdType;
                if(param != null )
                {
                    command.Parameters.AddRange(param);
                }
                try
                {
                    MySqlDataReader reader = command.ExecuteReader();
                    List<T> list = DataReaderToList<T>(reader);
                    return list;
                }
                catch(Exception e)
                {
                    throw;
                }
                finally
                {
                    con.Close();
                }
            }
        }

        /// <summary>
        /// Dapper增删改(包含存储过程及sql语句查询)
        /// </summary>
        /// <param name="sql">存储过程名称或者sql语句</param>
        /// <param name="param">参数化处理</param>
        /// <param name="isStoredProcedure">是否存储过程查询</param>
        /// <returns></returns>
        public bool DapperExcute(string sql , object param , bool? isStoredProcedure=false,int?commandTimeout=null)
        {
            bool result = false;
            using(IDbConnection con = new MySqlConnection(connectionStr))
            {
                con.Open();
                IDbTransaction tran = con.BeginTransaction();
                CommandType cmdType = isStoredProcedure==true ? CommandType.StoredProcedure : CommandType.Text;
                try
                {
                    int query = con.Execute(sql , param , tran , commandTimeout , cmdType);
                    tran.Commit();
                    result = true;
                }
                catch(Exception e)
                {
                    tran.Rollback();
                    throw;
                }
                finally
                {
                    con.Close();
                }
                return result;
            }
                
        }

        /// <summary>
        /// TSQL增删改操作
        /// </summary>
        /// <param name="sql"></param>
        /// <param name="param"></param>
        /// <param name="isStoredProcedure"></param>
        /// <returns></returns>
        public bool TSqlExcute(string sql , MySqlParameter[] param , bool? isStoredProcedure=false)
        {
            bool result = false;
            using(MySqlConnection con = new MySqlConnection(connectionStr))
            {
                con.Open();
                MySqlTransaction tran = con.BeginTransaction();
                CommandType cmdType = isStoredProcedure==true ? CommandType.StoredProcedure : CommandType.Text;
                MySqlCommand command = new MySqlCommand(sql , con , tran);
                command.Parameters.AddRange(param);
                try
                {
                    int query = command.ExecuteNonQuery();
                    tran.Commit();
                    result = true;
                }
                catch(Exception e)
                {
                    tran.Rollback();
                    throw;
                }
                finally
                {
                    con.Close();
                }
                return result;
            }
        }

        /// <summary>
        /// 批量数据写入
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <param name="sql"></param>
        /// <param name="dataList"></param>
        /// <returns></returns>
        private bool BulkInsert<T>(string sql , List<T> dataList) where T:new()
        {
            bool result = false;
            //获取T的公共属性
            Type type = dataList[ 0 ].GetType();
            PropertyInfo[] param = type.GetProperties();
            List<string> properotyList = param.Select(p => p.Name).ToList();
            using(MySqlConnection con= new MySqlConnection(connectionStr))
            {
                con.Open();
                StringBuilder sb = new StringBuilder();
                sb.Append(sql);
                sb.Append(" VALUES");
                int i = 0;
                foreach(var item in dataList)
                {
                    sb.Append("(");
                    for(int j = 0 ; j < properotyList.Count ; j++)
                    {
                        PropertyInfo properotyInfo = item.GetType().GetProperty(properotyList[ j ]); // 属性的信息
                        object properotyValue = properotyInfo.GetValue(item , null);// 属性的值
                        string cellValue = properotyValue == null ? "" : properotyValue.ToString();// 单元格的值
                        sb.Append("\"");
                        sb.Append(properotyValue);
                        sb.Append("\"");
                        if(j < properotyList.Count - 1)
                        {
                            sb.Append(",");
                        }
                    }
                    sb.Append(")");
                    if(i++ < dataList.Count - 1)
                    {
                        sb.Append(",");
                    }
                }
                sql = sb.ToString();

                MySqlTransaction tran = con.BeginTransaction();
                MySqlCommand commd = new MySqlCommand(sql , con , tran);
                try
                {
                    int query = commd.ExecuteNonQuery();
                    result = true;
                }
                catch(Exception e)
                {
                    tran.Rollback();
                    throw;
                }
                return result;
            }
        }




        /// <summary>
        /// DataReader To List
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <param name="reader"></param>
        /// <returns></returns>
        private static List<T> DataReaderToList<T>(MySqlDataReader reader) where T : new()
        {
            List<T> list = new List<T>();
            if(reader.HasRows)
            {
                while(reader.Read())
                {
                    T t = new T();
                    Type type = t.GetType();
                    var properties = type.GetProperties();
                    foreach(var item in properties)
                    {
                        string name = item.Name;
                        reader.GetSchemaTable().DefaultView.RowFilter = "ColumnName= ‘" + name + "";
                        bool check = reader.GetSchemaTable().DefaultView.Count > 0;
                        if(check)
                        {
                            if(!item.CanWrite)
                            {
                                continue;
                            }
                            var value = reader[ name ];
                            if(value != DBNull.Value)
                            {
                                item.SetValue(t , value , null);
                            }
                        }
                    }
                    list.Add(t);
                }
            }
            return list;
        }
    }
}

 

以上是关于C#操作MySql数据库帮助类(Dapper,T-Sql)的主要内容,如果未能解决你的问题,请参考以下文章

C# Dapper基本三层架构使用 (架构关系)

c# dapper mysql like 参数化

C# Dapper基本三层架构使用 (DAL)

C# Dapper基本三层架构使用 (Model)

在C#的控制台应用中使用Dapper链接MySQL并执行一些增删改查

dapper C#的Iconvertible问题