zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    java内存区域模型
    Java类加载器(双亲委派模型)(综述)
    2.无重复字符的最长子串
    浅谈Java中的对象和引用
    OSI七层协议大白话解读
    MPLS
    计算机网络为什么要分为五层结构?其依据是什么?
    前端技巧小结
    移动端尺寸新写法-rem
    编写高质量代码:Web前端开发修炼之道(四)
  • 原文地址:https://www.cnblogs.com/peng0731/p/9110735.html
Copyright © 2011-2022 走看看