SqlServer SqlBulkCopy批量插入 -- 多张表同时插入(事务)

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

 

posted @ 2018-05-30 14:33  没有梦想也没有妳  阅读(985)  评论(0编辑  收藏  举报