这段时间在解决一个多个表需要同时插入大量数据的问题,于是在网上找了下,查到说用SqlBulkCopy效率很高,实验后确实很快,10万条数据只要4秒钟,用ef要用40秒。但是我的还需两张表同时插入,且需要用到事务,即有一个失败,全部Rollback,废话不多说,直接上代码吧,下面是用C#语言编写的。
测试代码:这是一个简单的控制台程序,相信你们都看得懂就不多说了
namespace ConsoleApp12 { class Program { static void Main(string[] args) { DataTable dt = new DataTable(); dt.Columns.Add("part", typeof(System.String)); dt.Columns.Add("name", typeof(System.String)); for (int i = 0; i < 20; i++) { DataRow dr = dt.NewRow(); dr[0] = "餐饮部"; dr[1] = "店" + i.ToString(); dt.Rows.Add(dr); } DataTable dt2 = new DataTable(); dt2.Columns.Add("parts", typeof(System.String)); dt2.Columns.Add("names", typeof(System.String)); for (int i = 0; i < 20; i++) { DataRow dr2 = dt2.NewRow(); dr2[0] = "2餐饮部"; dr2[1] = "2店" + i.ToString(); dt2.Rows.Add(dr2); } string connectionString = "server =.; uid = sa; pwd =123456;database=Test"; all.ExecuteSqlTran1(connectionString, "test11", dt, "test12", dt2); } } }
数据库帮助类:主要是这部分,网上是也有写,但是多数含糊而过,并没有给出具体代码,小弟不才,在这里补全了,希望可以帮助到其他的新手。
/// <summary> /// 多个数据库表同时插入大量数据,并实现数据库事务。 /// </summary> /// <param name="SQLStringList">多条SQL语句</param> public static int ExecuteSqlTran1(string connectionString, string TableName1, DataTable dt1, string TableName2, DataTable dt2) { using (SqlConnection conn = new SqlConnection(connectionString)) { conn.Open(); SqlCommand cmd = new SqlCommand(); cmd.Connection = conn; SqlTransaction tx = conn.BeginTransaction(); cmd.Transaction = tx; try { int count = 1; using (SqlBulkCopy sqlBC1 = new SqlBulkCopy(conn, SqlBulkCopyOptions.CheckConstraints, tx)) { sqlBC1.DestinationTableName = TableName1;//***代表要插入数据的表名 foreach (DataColumn dc in dt1.Columns) //传入上述table { sqlBC1.ColumnMappings.Add(dc.ColumnName, dc.ColumnName);//将table中的列与数据库表这的列一一对应 } sqlBC1.WriteToServer(dt1); } using (SqlBulkCopy sqlBC2 = new SqlBulkCopy(conn, SqlBulkCopyOptions.CheckConstraints, tx)) { sqlBC2.DestinationTableName = TableName2;//***代表要插入数据的表名 foreach (DataColumn dc in dt2.Columns) //传入上述table { sqlBC2.ColumnMappings.Add(dc.ColumnName, dc.ColumnName);//将table中的列与数据库表这的列一一对应 } sqlBC2.WriteToServer(dt2); } tx.Commit(); return count; } catch(Exception ex) { var error = ex.ToString(); tx.Rollback(); return 0; } } }
结果在数据库中已经将dt中内容插入了两遍,实现了向两张表同时插入数据,另外,相信大家有耐心看到这的话,3个表同时插入,4个表同时插入也都会了,希望能帮助到大家。
小弟不才,有问题请随时联系我,一起长进知识。
qq:188261629