这段时间在解决一个多个表需要同时插入大量数据的问题,于是在网上找了下,查到说用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