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

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章