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