项目场景:
本人设备行业,最近做设备与管理系统对接,遇到客户从erp里面到处的excell文件需要批量导入到设备。从网上找了资料用mysql中的事务管理进行导入这个方式是不错的。
问题描述:
一般情况下我都是将文件导入到mysql数据库中,通过我写的上位机程序再从数据库里面增删改查,根据客户的使用原则进行分类使用。最近碰到客户下料单一次下一周的工作量。在导入的过程中发现特别慢。
原因分析:
如果利用for循环的话,需要每一次都进行上位软件与mysql的链接断开操作,或者是一直链接不用断开也需要上位软件与mysql软件在每一次插入数据时进行交互操作。势必要占用很多资源。
解决方案:
利用mysql的事务解决。
public static int uptable(DataGridView dvv)
{ sql = @"create table jztable(id int not null primary key auto_increment,
唯一ID char(32) not null,
组号 char(32) not null,
型材 char(64) ,
型号规格 char(64) not null,
切割长度 char(32) not null,
客户名称 char(64),
颜色 char(64) ,
数量 char(4) ,
左角度 char(4) ,
右角度 char(4) ,
生产单号 char(64),
原料标识 char(4),
型材长度 char(8) not null,
窗号 char(8),
是否加工 char(4),
销售单合同号 char(64));";
// 1建立数据表
mysqlUnity.CreateTable(sql, "辛格尔");
//2 创建sql语句
sql = @"insert into jztable( 唯一ID,组号,型材,型号规格,切割长度,客户名称,颜色,数量,左角度,右角度,生产单号,原料标识,型材长度,窗号,是否加工,销售单合同号) values(@pa1,@pa2,@pa3,@pa4,@pa5,@pa6,@pa7,@pa8,@pa9,@pa10,@pa11,@pa12,@pa13,@pa14,@pa15,@pa16); ";
List<MySqlParameter> paralist = new List<MySqlParameter>();
using (MySqlConnection conn = new MySqlConnection(GetSqlString("辛格尔")))
{
using (MySqlCommand cmd=new MySqlCommand(sql,conn))
{
conn.Open();
// 开始创建事务
MySqlTransaction tx = conn.BeginTransaction();
cmd.Transaction = tx;
#region
int count = dvv.Rows.Count - 2;
for (int i = 0; i <dvv.Rows.Count-1; i++)
{
if (dvv.Rows[i].Cells["唯一ID"].Value != null)
{
paralist.Clear();
paralist.Add(new MySqlParameter("@pa1",(object)dvv.Rows[i].Cells["唯一ID"].Value.ToString()));
paralist.Add(new MySqlParameter("@pa2",(object)dvv.Rows[i].Cells["组号"].Value.ToString()));
paralist.Add(new MySqlParameter("@pa3",(object)dvv.Rows[i].Cells["型材"].Value.ToString()));
paralist.Add(new MySqlParameter("@pa4",(object)dvv.Rows[i].Cells["型号规格"].Value.ToString()));
paralist.Add(new MySqlParameter("@pa5",(object)dvv.Rows[i].Cells["切割长度"].Value.ToString()));
paralist.Add(new MySqlParameter("@pa6",(object)dvv.Rows[i].Cells["客户名称"].Value.ToString()));
paralist.Add(new MySqlParameter("@pa7",(object)dvv.Rows[i].Cells["颜色"].Value.ToString()));
paralist.Add(new MySqlParameter("@pa8",(object)dvv.Rows[i].Cells["数量"].Value.ToString()));
paralist.Add(new MySqlParameter("@pa9",(object)dvv.Rows[i].Cells["左角度"].Value.ToString()));
paralist.Add(new MySqlParameter("@pa10",(object)dvv.Rows[i].Cells["右角度"].Value.ToString()));
paralist.Add(new MySqlParameter("@pa11",(object)dvv.Rows[i].Cells["生产单号"].Value.ToString()));
paralist.Add(new MySqlParameter("@pa12",(object)dvv.Rows[i].Cells["原料标识"].Value.ToString()));
paralist.Add(new MySqlParameter("@pa13",(object)dvv.Rows[i].Cells["型材长度"].Value.ToString()));
paralist.Add(new MySqlParameter("@pa14",(object)dvv.Rows[i].Cells["窗号"].Value.ToString()));
paralist.Add(new MySqlParameter("@pa15",(object)dvv.Rows[i].Cells["是否加工"].Value.ToString()));
paralist.Add(new MySqlParameter("@pa16",(object)dvv.Rows[i].Cells["销售单合同号"].Value.ToString()));
cmd.Parameters.Clear();
cmd.Parameters.AddRange(paralist.ToArray());
cmd.ExecuteNonQuery();
//3每一千条利用commit执行一次
if (i>0&&(i%1000==0))
{
tx.Commit();
tx = conn.BeginTransaction();
}
}
}//#endfor
//for循环完成以后一定要再一次commit();不然会用遗漏的数据。
tx.Commit();
conn.Close();
return 0;
#endregion
}
}
}