最近做了一个功能, 操作的数据量特别大,
一次 往数据库 插入上万条数据。我用了 循环添加, 和EF封装的添加功能。
两次方式速度都非常慢,一万条数据都要近一分钟的时间。
在网上 查找资料后, 可以创建一个Datatable对象,然后把数据都赋值给这个Datatable对象的列。
然后Copy到数据库就行了。
下面这段代码是:实例化一个Datatable, 然后确定所有的列。列名最好于表里的字段一样哦
然后循环你的 大数据,每次循环都创建一列,添加到Datatable。
1 Datatable dt=new Datatable //创建Datatbel数据源 2 3 //确定DataTable字段的类型 4 dt.Columns.Add("ProductID", typeof(int)); 5 dt.Columns.Add("TracingCode", typeof(string)); 6 dt.Columns.Add("Createtime", typeof(DateTime)); 7 8 //循环list数组, 每循环一个,创建一行 9 //然后添加到DataTable里面 10 foreach (es_Tracing tracing in TracingList) 11 { 12 DataRow dr = dt.NewRow(); 13 dr["ProductID"] = tracing.ProductID; 14 dr["TracingCode"] = tracing.TracingCode; 15 dr["Createtime"] = tracing.Createtime; 16 dt.Rows.Add(dr); 17 }
然后把这个dt Copy到 指定表里面就行了
1 //实例化一个 SqlBulkCopy 对象 2 using (SqlBulkCopy bulkCopy = new SqlBulkCopy(connectionString, SqlBulkCopyOptions.KeepIdentity | SqlBulkCopyOptions.UseInternalTransaction)) 3 { 4 //目标表,就是说您将要将数据插入到哪个表中去 5 bulkCopy.DestinationTableName = "dbo.[es_Tracing]"; 6 //数据源中的列名与目标表的属性的映射关系 7 bulkCopy.ColumnMappings.Add("ProductID", "ProductID"); 8 bulkCopy.ColumnMappings.Add("TracingCode", "TracingCode"); 9 bulkCopy.ColumnMappings.Add("Createtime", "Createtime"); 10 11 12 bulkCopy.WriteToServer(dt);//将数据源数据写入到目标表中 13 14 //Stopwatch stopwatch = new Stopwatch();//跑表类,该类可以进行时间的统计 15 //stopwatch.Start();//跑表开始 16 //中间就是执行的操作, 就可以计算操作开始到结束的时间 17 //stopwatch.Elapsed //跑表结束 18 }
以上是我的 比较简洁的代码,可以自己封装哦。end..