MySqlHelper

执行sql语句方法定义:

public static Object SqlScalar(string connectString, string sql)
        {
            return SqlScalar(connectString, sql, 1);
        }
        public static Object SqlScalar(string connectString, string sql, object parms)
        {
            return SqlScalar(connectString, sql, parms, 1);
        }
        public static int SqlExecute(string connectString, string sql)
        {
            return SqlExecute(connectString, sql, 1);
        }
        public static int SqlExecute(string connectString, string sql, object parms)
        {
            return SqlExecute(connectString, sql, parms, 1);
        }
        public static T SqlSingle<T>(string connectString, string sql)
        {
            return SqlSingle<T>(connectString, sql, 1);
        }
        public static T SqlSingle<T>(string connectString, string sql, object parms)
        {
            return SqlSingle<T>(connectString, sql, parms, 1);
        }
        public static List<T> SqlList<T>(string connectString, string sql)
        {
            return SqlList<T>(connectString, sql, 1);
        }
        public static List<T> SqlList<T>(string connectString, string sql, object parms)
        {
            return SqlList<T>(connectString, sql, parms, 1);
        }
        public static DataTable SqlDataTable(string connectString, string sql)
        {
            return SqlDataTable(connectString, sql, 1);
        }
        public static DataTable SqlDataTable(string connectString, string sql, object parms)
        {
            return SqlDataTable(connectString, sql, parms, 1);
        }

执行存储过程方法定义:

 public static Object ProScalar(string connectString, string proName)
        {
            return SqlScalar(connectString, proName, 4);
        }
        public static Object ProScalar(string connectString, string proName, object parms)
        {
            return SqlScalar(connectString, proName, parms, 4);
        }
        public static int ProExecute(string connectString, string proName)
        {
            return SqlExecute(connectString, proName, 4);
        }
        public static int ProExecute(string connectString, string proName, object parms)
        {
            return SqlExecute(connectString, proName, parms, 4);
        }
        public static T ProSingle<T>(string connectString, string proName)
        {
            return SqlSingle<T>(connectString, proName, 4);
        }
        public static T ProSingle<T>(string connectString, string proName, object parms)
        {
            return SqlSingle<T>(connectString, proName, parms, 4);
        }
        public static List<T> ProList<T>(string connectString, string proName)
        {
            return SqlList<T>(connectString, proName, 4);
        }
        public static List<T> ProList<T>(string connectString, string proName, object parms)
        {
            return SqlList<T>(connectString, proName, parms, 4);
        }
        public static DataTable ProDataTable(string connectString, string sql)
        {
            return SqlDataTable(connectString, sql, 4);
        }
        public static DataTable ProDataTable(string connectString, string sql, object parms)
        {
            return SqlDataTable(connectString, sql, parms, 4);
        }

执行sql和存储过程方法实现:

#region SqlScalar

        /// <summary>
        /// 返回查询结果的第一行第一列
        /// </summary>
        /// <param name="connectString">数据库连接串</param>
        /// <param name="sql">sql语句,或者存储过程名称</param>
        /// <param name="commandType">sql语句</param>
        /// <returns></returns>
        private static Object SqlScalar(string connectString, string sql, int commandType = 1)
        {
            object obj = null;
            using (MySqlConnection conn = new MySqlConnection(connectString))
            {
                conn.Open();
                using (MySqlCommand cmd = new MySqlCommand(sql, conn))
                {
                    if (commandType == 1)
                    {
                        cmd.CommandType = CommandType.Text;
                    }
                    else
                    {
                        cmd.CommandType = CommandType.StoredProcedure;
                    }
                    obj = cmd.ExecuteScalar();
                }
            }
            return obj;
        }
        /// <summary>
        /// 返回查询结果的第一行第一列
        /// </summary>
        /// <param name="connectString">数据库连接串</param>
        /// <param name="sql">sql语句</param>
        /// <param name="parms">参数</param>
        /// <returns></returns>
        private static Object SqlScalar(string connectString, string sql, object parms, int commandType = 1)
        {
            List<MySqlParameter> parmList = GetSqlCommandParams(parms);
            object obj = null;
            using (MySqlConnection conn = new MySqlConnection(connectString))
            {
                conn.Open();
                using (MySqlCommand cmd = new MySqlCommand(sql, conn))
                {
                    if (commandType == 1)
                    {
                        cmd.CommandType = CommandType.Text;
                    }
                    else
                    {
                        cmd.CommandType = CommandType.StoredProcedure;
                    }
                    if (parmList != null)
                    {
                        cmd.Parameters.AddRange(parmList.ToArray());
                    }
                    obj = cmd.ExecuteScalar();
                    cmd.Parameters.Clear();
                }
            }
            return obj;
        }

        #endregion

        #region SqlExecute
        /// <summary>
        /// 返回影响数据库的条数
        /// </summary>
        /// <param name="connectString">数据库连接串</param>
        /// <param name="sql">要执行的sql</param>
        /// <returns></returns>
        private static int SqlExecute(string connectString, string sql, int commandType = 1)
        {
            int obj = 0;
            using (MySqlConnection conn = new MySqlConnection(connectString))
            {
                conn.Open();
                using (MySqlCommand cmd = new MySqlCommand(sql, conn))
                {
                    if (commandType == 1)
                    {
                        cmd.CommandType = CommandType.Text;
                    }
                    else
                    {
                        cmd.CommandType = CommandType.StoredProcedure;
                    }
                    obj = cmd.ExecuteNonQuery();
                }
            }
            return obj;
        }

        private static int SqlExecute(string connectString, string sql, object parms, int commandType = 1)
        {
            List<MySqlParameter> parmList = GetSqlCommandParams(parms);
            int obj = 0;
            using (MySqlConnection conn = new MySqlConnection(connectString))
            {
                conn.Open();
                using (MySqlCommand cmd = new MySqlCommand(sql, conn))
                {
                    if (commandType == 1)
                    {
                        cmd.CommandType = CommandType.Text;
                    }
                    else
                    {
                        cmd.CommandType = CommandType.StoredProcedure;
                    }
                    if (parmList != null)
                    {
                        cmd.Parameters.AddRange(parmList.ToArray());
                    }
                    obj = cmd.ExecuteNonQuery();
                    cmd.Parameters.Clear();
                }
            }
            return obj;
        }
        #endregion

        #region SqlSingle
        /// <summary>
        /// 返回查询结果的第一行
        /// </summary>
        /// <typeparam name="T">要返回的类型</typeparam>
        /// <param name="connectString">数据库连接串</param>
        /// <param name="sql">要执行的sql</param>
        /// <returns></returns>
        private static T SqlSingle<T>(string connectString, string sql, int commandType = 1)
        {
            T obj = default(T);
            Type t = typeof(T);
            Assembly ass = t.Assembly;
            PropertyInfo p = null;
            using (MySqlConnection conn = new MySqlConnection(connectString))
            {
                conn.Open();
                using (MySqlCommand cmd = new MySqlCommand(sql, conn))
                {
                    if (commandType == 1)
                    {
                        cmd.CommandType = CommandType.Text;
                    }
                    else
                    {
                        cmd.CommandType = CommandType.StoredProcedure;
                    }
                    using (MySqlDataReader dr = cmd.ExecuteReader())
                    {
                        if (dr != null)
                        {
                            Dictionary<string, PropertyInfo> propertysDic = GetFiles<T>(dr);
                            while (dr.Read())
                            {
                                obj = (T)ass.CreateInstance(t.FullName);
                                if (propertysDic != null && propertysDic.Count > 0)
                                {
                                    foreach (var key in propertysDic.Keys)
                                    {
                                        p = propertysDic[key];
                                        p.SetValue(obj, MySqlHelper.ChangeType(dr[key], p.PropertyType));
                                    }
                                }
                                break;
                            }
                        }
                    }
                }
            }
            return obj;
        }


        private static T SqlSingle<T>(string connectString, string sql, object parms, int commandType = 1)
        {
            List<MySqlParameter> parmList = GetSqlCommandParams(parms);
            T obj = default(T);
            Type t = typeof(T);
            Assembly ass = t.Assembly;
            PropertyInfo p = null;
            using (MySqlConnection conn = new MySqlConnection(connectString))
            {
                conn.Open();
                using (MySqlCommand cmd = new MySqlCommand(sql, conn))
                {
                    if (commandType == 1)
                    {
                        cmd.CommandType = CommandType.Text;
                    }
                    else
                    {
                        cmd.CommandType = CommandType.StoredProcedure;
                    }
                    if (parmList != null)
                    {
                        cmd.Parameters.AddRange(parmList.ToArray());
                    }
                    using (MySqlDataReader dr = cmd.ExecuteReader())
                    {
                        if (dr != null)
                        {
                            Dictionary<string, PropertyInfo> propertysDic = GetFiles<T>(dr);
                            while (dr.Read())
                            {
                                obj = (T)ass.CreateInstance(t.FullName);
                                if (propertysDic != null && propertysDic.Count > 0)
                                {
                                    foreach (var key in propertysDic.Keys)
                                    {
                                        p = propertysDic[key];
                                        p.SetValue(obj, MySqlHelper.ChangeType(dr[key], p.PropertyType));
                                    }
                                }
                                break;
                            }
                        }
                    }
                    cmd.Parameters.Clear();
                }
            }
            return obj;
        }
        #endregion

        #region SqlList
        /// <summary>
        /// 返回列表集合
        /// </summary>
        /// <typeparam name="T">要返回的对象类型</typeparam>
        /// <param name="connectString">数据库连接串</param>
        /// <param name="sql">要执行的sql</param>
        /// <returns></returns>
        private static List<T> SqlList<T>(string connectString, string sql, int commandType = 1)
        {
            List<T> list = new List<T>();
            Type t = typeof(T);
            Assembly ass = t.Assembly;

            PropertyInfo p = null;
            using (MySqlConnection conn = new MySqlConnection(connectString))
            {
                conn.Open();
                using (MySqlCommand cmd = new MySqlCommand(sql, conn))
                {
                    if (commandType == 1)
                    {
                        cmd.CommandType = CommandType.Text;
                    }
                    else
                    {
                        cmd.CommandType = CommandType.StoredProcedure;
                    }
                    using (MySqlDataReader dr = cmd.ExecuteReader())
                    {
                        if (dr != null)
                        {
                            Dictionary<string, PropertyInfo> propertysDic = GetFiles<T>(dr);
                            while (dr.Read())
                            {
                                T obj = default(T);
                                obj = (T)ass.CreateInstance(t.FullName);
                                if (propertysDic != null && propertysDic.Count > 0)
                                {
                                    foreach (var key in propertysDic.Keys)
                                    {
                                        p = propertysDic[key];
                                        p.SetValue(obj, MySqlHelper.ChangeType(dr[key], p.PropertyType));
                                    }
                                }
                                list.Add(obj);
                            }

                        }

                    }
                }
            }
            return list;
        }

        /// <summary>
        /// 返回列表集合
        /// </summary>
        /// <typeparam name="T">要返回的对象类型</typeparam>
        /// <param name="connectString">数据库连接串</param>
        /// <param name="sql">要执行的sql</param>
        /// <param name="parms">sql中用到的参数</param>
        /// <returns></returns>
        private static List<T> SqlList<T>(string connectString, string sql, object parms, int commandType = 1)
        {
            List<MySqlParameter> parmList = GetSqlCommandParams(parms);
            List<T> list = new List<T>();
            Type t = typeof(T);
            Assembly ass = t.Assembly;
            PropertyInfo p = null;
            using (MySqlConnection conn = new MySqlConnection(connectString))
            {
                conn.Open();
                using (MySqlCommand cmd = new MySqlCommand(sql, conn))
                {
                    if (commandType == 1)
                    {
                        cmd.CommandType = CommandType.Text;
                    }
                    else
                    {
                        cmd.CommandType = CommandType.StoredProcedure;
                    }
                    if (parmList != null)
                    {
                        cmd.Parameters.AddRange(parmList.ToArray());
                    }
                    using (MySqlDataReader dr = cmd.ExecuteReader())
                    {
                        if (dr != null)
                        {
                            Dictionary<string, PropertyInfo> propertysDic = GetFiles<T>(dr);
                            while (dr.Read())
                            {
                                T obj = default(T);
                                obj = (T)ass.CreateInstance(t.FullName);
                                if (propertysDic != null && propertysDic.Count > 0)
                                {
                                    foreach (var key in propertysDic.Keys)
                                    {
                                        p = propertysDic[key];
                                        p.SetValue(obj, MySqlHelper.ChangeType(dr[key], p.PropertyType));
                                    }
                                }
                                list.Add(obj);
                            }

                        }
                    }
                    cmd.Parameters.Clear();
                }
            }
            return list;
        }
        #endregion

        #region SqlDataTable
        private static DataTable SqlDataTable(string connectString, string sql, int commandType = 1)
        {
            DataTable dt = null;
            DataSet ds = new DataSet();
            using (MySqlConnection conn = new MySqlConnection(connectString))
            {
                conn.Open();
                using (MySqlCommand cmd = new MySqlCommand(sql, conn))
                {
                    if (commandType == 1)
                    {
                        cmd.CommandType = CommandType.Text;
                    }
                    else
                    {
                        cmd.CommandType = CommandType.StoredProcedure;
                    }
                    using (MySqlDataAdapter da = new MySqlDataAdapter(cmd))
                    {
                        da.Fill(ds);
                    }
                }
            }
            if (ds != null && ds.Tables != null && ds.Tables.Count > 0)
            {
                dt = ds.Tables[0];
            }
            return dt;
        }
        private static DataTable SqlDataTable(string connectString, string sql, object parms, int commandType = 1)
        {
            List<MySqlParameter> parmList = GetSqlCommandParams(parms);
            DataTable dt = null;
            DataSet ds = new DataSet();
            using (MySqlConnection conn = new MySqlConnection(connectString))
            {
                conn.Open();
                using (MySqlCommand cmd = new MySqlCommand(sql, conn))
                {
                    if (commandType == 1)
                    {
                        cmd.CommandType = CommandType.Text;
                    }
                    else
                    {
                        cmd.CommandType = CommandType.StoredProcedure;
                    }
                    if (parmList != null)
                    {
                        cmd.Parameters.AddRange(parmList.ToArray());
                    }
                    using (MySqlDataAdapter da = new MySqlDataAdapter(cmd))
                    {
                        da.Fill(ds);
                    }
                }
            }
            if (ds != null && ds.Tables != null && ds.Tables.Count > 0)
            {
                dt = ds.Tables[0];
            }
            return dt;
        }
        #endregion

        #region GetSqlCommandParams
        /// <summary>
        /// 获取sqlcommand参数
        /// </summary>
        /// <param name="parms"></param>
        /// <returns></returns>
        private static List<MySqlParameter> GetSqlCommandParams(object parms)
        {
            List<MySqlParameter> parmList = null;
            PropertyInfo[] propertys = parms.GetType().GetProperties();
            if (propertys != null && propertys.Length > 0)
            {
                parmList = new List<MySqlParameter>();
                foreach (var item in propertys)
                {
                    if (!item.CanRead)
                    {
                        continue;
                    }
                    parmList.Add(new MySqlParameter("@" + item.Name, item.GetValue(parms)));
                }
            }
            return parmList;
        }
        #endregion

        #region GetFiles
        /// <summary>
        /// 获取泛型中的类型属性和数据库datareder中的属性共有部分
        /// </summary>
        /// <typeparam name="T">要返回的类型</typeparam>
        /// <param name="reader">SqlDataReader</param>
        /// <returns></returns>
        private static Dictionary<string, PropertyInfo> GetFiles<T>(MySqlDataReader reader)
        {
            Dictionary<string, PropertyInfo> result = new Dictionary<string, PropertyInfo>();
            int cloumFiles = reader == null ? 0 : reader.FieldCount;
            Type t = typeof(T);
            PropertyInfo[] propertys = t.GetProperties();
            if (propertys != null && cloumFiles > 0)
            {
                List<string> readerFilesList = new List<string>(); //存储当前reader中的所有列名称
                for (int i = 0; i < cloumFiles; i++)
                {
                    readerFilesList.Add(reader.GetName(i).ToLower());
                }
                //取reder中和T类型中都有属性
                List<PropertyInfo> resultList = propertys.Where(s => s.CanRead && readerFilesList.Contains(s.Name.ToLower())).ToList();
                if (resultList != null && resultList.Count > 0)
                {
                    foreach (var item in resultList)
                    {
                        result.Add(item.Name, item);
                    }
                }
            }
            return result;
        }
        #endregion

        #region ChangeType
        /// <summary>
        /// 将数据库中查询出来的值转化为T类型中想要的类型,这样避免直接赋值object类型装箱时的性能消耗
        /// </summary>
        /// <param name="value">数据库中查出来的value值</param>
        /// <param name="type">要转化的类型</param>
        /// <returns></returns>
        private static object ChangeType(object value, Type type)
        {
            if (type.FullName == typeof(string).FullName)
            {
                return Convert.ChangeType(Convert.IsDBNull(value) ? null : value, type);
            }
            if (type.IsGenericType && type.GetGenericTypeDefinition().Equals(typeof(Nullable<>)))
            {
                NullableConverter convertor = new NullableConverter(type);
                return Convert.IsDBNull(value) ? null : convertor.ConvertFrom(value);
            }
            return Convert.IsDBNull(value) ? null : value;
        }
        #endregion

批操作实现方法:

public static int BatchInsert<T>(string connectString, List<T> list, string tableName, string[] columns = null, int onceNum = 100)
        {
            if (list == null || list.Count == 0) throw new Exception("没有设置要插入的数据");
            int obj = 0;
            StringBuilder sqlBuiler = new StringBuilder();
            Type t = typeof(T);
            PropertyInfo[] propertys = t.GetProperties();
            if (propertys == null || propertys.Length == 0) return 0;
            List<PropertyInfo> propertys_insert = new List<PropertyInfo>();
            if (columns == null || columns.Length == 0)
            {
                //指定修改字段为空时,默认修改实体中除了条件属性外的其他所有属性对应的字段
                propertys_insert = propertys.ToList();
            }
            else
            {
                string[] columnsLower = string.Join(",", columns).ToLower().Split(',');
                foreach (var item in propertys)
                {
                    if (columnsLower.Contains(item.Name.ToLower()))
                    {
                        propertys_insert.Add(item);
                    }
                }
            }
            if (propertys_insert==null||propertys_insert.Count==0) throw new Exception("没有任何要插入的列");
            int i = 0;
            StringBuilder ziduans = new StringBuilder();
            for (int j = 0; j < propertys_insert.Count; j++)
            {
                ziduans.Append($"{propertys_insert[j].Name},");
            }
            sqlBuiler.Append($" insert into {tableName} ({ziduans.ToString().TrimEnd(',')}) values");
            using (MySqlConnection conn = new MySqlConnection(connectString))
            {
                conn.Open();
                MySqlTransaction tran = conn.BeginTransaction(IsolationLevel.ReadCommitted);
                using (MySqlCommand cmd = new MySqlCommand(sqlBuiler.ToString(), conn, tran))
                {
                    foreach (T row in list)
                    {
                        i++;
                        sqlBuiler.Append($"(");
                        for (int j = 0; j < propertys_insert.Count; j++)
                        {
                            if (j == propertys_insert.Count - 1)
                            {
                                sqlBuiler.Append($"@{propertys_insert[j].Name}_{i} ");
                            }
                            else
                            {
                                sqlBuiler.Append($"@{propertys_insert[j].Name}_{i},");
                            }
                            cmd.Parameters.Add(new MySqlParameter("@" + propertys_insert[j].Name + "_" + i, propertys_insert[j].GetValue(row)));
                        }
                        sqlBuiler.Append($"),");
                        if (i % onceNum == 0 || i == list.Count)
                        {
                            try
                            {
                                //执行sql
                                cmd.CommandText = sqlBuiler.ToString().TrimEnd(',');
                                obj += cmd.ExecuteNonQuery();
                                tran.Commit();
                                if (i < list.Count)
                                {
                                    tran = conn.BeginTransaction(IsolationLevel.ReadCommitted);
                                }
                                sqlBuiler.Clear();
                                sqlBuiler.Append($" insert into {tableName} ({ziduans.ToString().TrimEnd(',')}) values");
                                cmd.Parameters.Clear();
                            }
                            catch (Exception)
                            {
                                tran.Rollback();
                                throw;
                            }

                        }
                    }
                }

            }
            return obj;
        }

        public static int BatchInsert(string connectString, DataTable dt, string tableName, string[] columns = null, int onceNum = 100)
        {
            if (dt == null || dt.Rows == null || dt.Rows.Count == 0) throw new Exception("没有设置要插入的数据");
            int obj = 0;
            StringBuilder sqlBuiler = new StringBuilder();
            List<string> ufilds = new List<string>(); //所有要修改的字段
            DataColumnCollection coll = dt.Columns;
            string[] columnsLower = null;
            if (columns != null && columns.Length > 0)
            {
                columnsLower = string.Join(",", columns).ToLower().Split(',');
            }
            //指定了要插入的列时按照指定列插入,没有指定插入的列时把dt中所有列全部插入
            foreach (DataColumn item in coll)
            {
                if (columnsLower != null && columnsLower.Length > 0)
                {
                    if (columnsLower.Contains(item.ColumnName.ToLower()))
                    {
                        ufilds.Add(item.ColumnName);
                    }
                }
                else
                {
                    ufilds.Add(item.ColumnName);
                }
            }
            if (ufilds == null || ufilds.Count == 0)
            {
                throw new Exception("没有任何要插入的列");
            }
            int i = 0;
            StringBuilder ziduans = new StringBuilder();
            for (int j = 0; j < ufilds.Count; j++)
            {
                ziduans.Append($"{ufilds[j]},");
            }
            sqlBuiler.Append($" insert into {tableName} ({ziduans.ToString().TrimEnd(',')}) values");
            using (MySqlConnection conn = new MySqlConnection(connectString))
            {
                conn.Open();
                MySqlTransaction tran = conn.BeginTransaction(IsolationLevel.ReadCommitted);
                using (MySqlCommand cmd = new MySqlCommand(sqlBuiler.ToString(), conn, tran))
                {
                    foreach (DataRow row in dt.Rows)
                    {
                        i++;
                        sqlBuiler.Append("(");
                        for (int j = 0; j < ufilds.Count; j++)
                        {
                            if (j == ufilds.Count - 1)
                            {
                                sqlBuiler.Append($"@{ufilds[j]}_{i}");
                            }
                            else
                            {
                                sqlBuiler.Append($"@{ufilds[j]}_{i},");
                            }
                            cmd.Parameters.Add(new MySqlParameter("@" + ufilds[j] + "_" + i, row[ufilds[j]]));
                        }
                        sqlBuiler.Append("),");
                        if (i % onceNum == 0 || i == dt.Rows.Count)
                        {
                            try
                            {
                                cmd.CommandText = sqlBuiler.ToString().TrimEnd(',');
                                obj += cmd.ExecuteNonQuery();
                                tran.Commit();
                                if (i < dt.Rows.Count)
                                {
                                    tran = conn.BeginTransaction(IsolationLevel.ReadCommitted);
                                }
                                sqlBuiler.Clear();
                                sqlBuiler.Append($" insert into {tableName} ({ziduans.ToString().TrimEnd(',')}) values");
                                cmd.Parameters.Clear();
                            }
                            catch (Exception)
                            {
                                tran.Rollback();
                                throw;
                            }
                        }
                    }
                }
            }
            return obj;
        }

        /// <summary>
        /// 批量修改,使用了事务
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <param name="connectString">数据库连接字符串</param>
        /// <param name="list">要修改的数据集</param>
        /// <param name="tableName">要修改表名</param>
        /// <param name="primaryKeyName">修改时的条件字段,一般修改是按照主键修改的比较多</param>
        /// <param name="columns">要修改的字段名称,
        /// 如果为空则把T类型中的除primaryKeyName属性之外的所有属性和数据库字段对应进行修改,
        /// 属性名称和数据库字段对应时不区分大小写</param>
        /// <param name="onceNum">一次性提交的最大数量,因为参数有2100个的限制,所以批量时会分多次进行提交,onceNum设置每次提交的数量</param>
        /// <returns>影响数据库的条数</returns>
        public static int BatchUpdate<T>(string connectString, List<T> list, string tableName, string primaryKeyName, string[] columns = null, int onceNum = 100)
        {
            if (list == null || list.Count == 0) return 0;
            int obj = 0;
            StringBuilder sqlBuiler = new StringBuilder();
            Type t = typeof(T);
            PropertyInfo[] propertys = t.GetProperties();
            if (propertys == null || propertys.Length == 0) return 0;
            PropertyInfo wherep = propertys.Where(s => s.Name.ToLower() == primaryKeyName.ToLower()).ToArray()[0]; //拼接修改条件的属性
            List<PropertyInfo> propertys_update = new List<PropertyInfo>();
            if (columns == null || columns.Length == 0)
            {
                //指定修改字段为空时,默认修改实体中除了条件属性外的其他所有属性对应的字段
                propertys_update = propertys.Where(s => s.Name.ToLower() != primaryKeyName.ToLower()).ToList();
            }
            else
            {
                string[] columnsLower = string.Join(",", columns).ToLower().Split(',');
                foreach (var item in propertys)
                {
                    if (columnsLower.Contains(item.Name.ToLower()) && item.Name.ToLower() != primaryKeyName.ToLower())
                    {
                        propertys_update.Add(item);
                    }
                }
            }
            int i = 0;
            using (MySqlConnection conn = new MySqlConnection(connectString))
            {
                conn.Open();
                MySqlTransaction tran = conn.BeginTransaction(IsolationLevel.ReadCommitted); ;
                using (MySqlCommand cmd = new MySqlCommand(sqlBuiler.ToString(), conn, tran))
                {
                    foreach (T row in list)
                    {
                        i++;
                        sqlBuiler.Append($" update {tableName} Set ");
                        for (int j = 0; j < propertys_update.Count; j++)
                        {
                            if (j == propertys_update.Count - 1)
                            {
                                sqlBuiler.Append($"{propertys_update[j].Name}=@{propertys_update[j].Name}_{i} ");
                            }
                            else
                            {
                                sqlBuiler.Append($"{propertys_update[j].Name}=@{propertys_update[j].Name}_{i},");
                            }
                            cmd.Parameters.Add(new MySqlParameter("@" + propertys_update[j].Name + "_" + i, propertys_update[j].GetValue(row)));
                        }
                        sqlBuiler.Append($" where {primaryKeyName}=@{primaryKeyName}_{i};");
                        cmd.Parameters.Add(new MySqlParameter("@" + primaryKeyName + "_" + i, wherep.GetValue(row)));
                        if (i % onceNum == 0 || i == list.Count)
                        {
                            try
                            {
                                //执行sql
                                cmd.CommandText = sqlBuiler.ToString();
                                obj += cmd.ExecuteNonQuery();
                                tran.Commit();
                                if (i < list.Count)
                                {
                                    tran = conn.BeginTransaction(IsolationLevel.ReadCommitted);
                                }
                                sqlBuiler.Clear();
                                cmd.Parameters.Clear();
                            }
                            catch (Exception)
                            {
                                tran.Rollback();
                                throw;
                            }

                        }
                    }
                }

            }
            return obj;
        }
        /// <summary>
        /// 批量修改,使用了事务
        /// </summary>
        /// <param name="connectString">数据库连接字符串</param>
        /// <param name="dt">要修改的数据源</param>
        /// <param name="tableName">要修改的表名</param>
        /// <param name="primaryKeyName">修改时的条件字段,一般是按照主键修改比较多</param>
        /// <param name="columns">要修改的字段名称
        /// 如果为空则把dt中所有列和数据表字段对应,修改除条件列外的所有列,
        /// 列明和数据库字段对应时不区分大小写</param>
        /// <param name="onceNum">一次性提交的最大数量,因为参数有2100个的限制,所以批量时会分多次进行提交,onceNum设置每次提交的数量</param>
        /// <returns></returns>
        public static int BatchUpdate(string connectString, DataTable dt, string tableName, string primaryKeyName, string[] columns = null, int onceNum = 100)
        {
            if (dt == null || dt.Rows == null || dt.Rows.Count == 0) return 0;
            int obj = 0;
            StringBuilder sqlBuiler = new StringBuilder();
            List<string> ufilds = new List<string>(); //所有要修改的字段
            DataColumnCollection coll = dt.Columns;
            string whereName = primaryKeyName;
            string[] columnsLower = null;
            if (columns != null && columns.Length > 0)
            {
                columnsLower = string.Join(",", columns).ToLower().Split(',');
            }

            foreach (DataColumn item in coll)
            {
                if (item.ColumnName.ToLower() != primaryKeyName.ToLower())
                {
                    if (columnsLower != null && columnsLower.Length > 0)
                    {
                        if (columnsLower.Contains(item.ColumnName.ToLower()))
                        {
                            ufilds.Add(item.ColumnName);
                        }
                    }
                    else
                    {
                        ufilds.Add(item.ColumnName);
                    }
                }
                else
                {
                    whereName = item.ColumnName;
                }
            }
            if (ufilds == null || ufilds.Count == 0)
            {
                return 0;
            }
            int i = 0;
            using (MySqlConnection conn = new MySqlConnection(connectString))
            {
                conn.Open();
                MySqlTransaction tran = conn.BeginTransaction(IsolationLevel.ReadCommitted);
                using (MySqlCommand cmd = new MySqlCommand(sqlBuiler.ToString(), conn, tran))
                {
                    foreach (DataRow row in dt.Rows)
                    {
                        i++;
                        sqlBuiler.Append($" update {tableName} Set ");
                        for (int j = 0; j < ufilds.Count; j++)
                        {
                            if (j == ufilds.Count - 1)
                            {
                                sqlBuiler.Append($"{ufilds[j]}=@{ufilds[j]}_{i} ");
                            }
                            else
                            {
                                sqlBuiler.Append($"{ufilds[j]}=@{ufilds[j]}_{i},");
                            }
                            cmd.Parameters.Add(new MySqlParameter("@" + ufilds[j] + "_" + i, row[ufilds[j]]));
                        }
                        sqlBuiler.Append($" where {primaryKeyName}=@{primaryKeyName}_{i};");
                        cmd.Parameters.Add(new MySqlParameter("@" + primaryKeyName + "_" + i, row[whereName]));
                        if (i % onceNum == 0 || i == dt.Rows.Count)
                        {
                            try
                            {
                                cmd.CommandText = sqlBuiler.ToString();
                                obj += cmd.ExecuteNonQuery();
                                tran.Commit();
                                if (i < dt.Rows.Count)
                                {
                                    tran = conn.BeginTransaction(IsolationLevel.ReadCommitted);
                                }
                                sqlBuiler.Clear();
                                cmd.Parameters.Clear();
                            }
                            catch (Exception)
                            {
                                tran.Rollback();
                                throw;
                            }
                        }
                    }
                }
            }
            return obj;
        }

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值