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

 

转载于:https://www.cnblogs.com/peng0731/p/9110735.html

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要避免在使用SqlBulkCopy插入数据时出现重复数据,可以考虑以下两种方法: 1. 在插入之前先检查是否存在重复数据,如果存在则不进行插入。可以通过在目标中设置唯一性约束或者创建临时并在其中进行检查来实现。 2. 在SqlBulkCopy的WriteToServer方法中使用SqlBulkCopyOptions中的KeepIdentity选项,以保留目标中已有的自增长主键,从而避免插入重复的自增长主键。 以下是使用第一种方法的示例代码: ```csharp using System.Data.SqlClient; using System.Data; //创建一个DataTable对象,用于存储要插入的数据 DataTable dt = new DataTable(); //添加列 dt.Columns.Add("Name", typeof(string)); dt.Columns.Add("Age", typeof(int)); //添加数据 dt.Rows.Add("John", 25); dt.Rows.Add("Mike", 30); //创建连接对象 SqlConnection conn = new SqlConnection("Data Source=.;Initial Catalog=TestDB;Integrated Security=True;"); //打开连接 conn.Open(); //创建事务对象 SqlTransaction tran = conn.BeginTransaction(); try { //创建SqlBulkCopy对象 using (SqlBulkCopy bulkCopy = new SqlBulkCopy(conn, SqlBulkCopyOptions.Default, tran)) { //设置目标名 bulkCopy.DestinationTableName = "Person"; //设置列映射 bulkCopy.ColumnMappings.Add("Name", "Name"); bulkCopy.ColumnMappings.Add("Age", "Age"); //使用SqlBulkCopyOptions中的CheckConstraints选项检查唯一性约束 bulkCopy.WriteToServer(dt, SqlBulkCopyOptions.CheckConstraints); } //提交事务 tran.Commit(); } catch (Exception ex) { //回滚事务 tran.Rollback(); throw ex; } finally { //关闭连接 conn.Close(); } ``` 使用第二种方法时,只需要在SqlBulkCopy的构造函数中指定KeepIdentity选项即可: ```csharp using System.Data.SqlClient; using System.Data; //创建一个DataTable对象,用于存储要插入的数据 DataTable dt = new DataTable(); //添加列 dt.Columns.Add("Name", typeof(string)); dt.Columns.Add("Age", typeof(int)); //添加数据 dt.Rows.Add("John", 25); dt.Rows.Add("Mike", 30); //创建连接对象 SqlConnection conn = new SqlConnection("Data Source=.;Initial Catalog=TestDB;Integrated Security=True;"); //打开连接 conn.Open(); //创建事务对象 SqlTransaction tran = conn.BeginTransaction(); try { //创建SqlBulkCopy对象,并设置KeepIdentity选项 using (SqlBulkCopy bulkCopy = new SqlBulkCopy(conn, SqlBulkCopyOptions.KeepIdentity, tran)) { //设置目标名 bulkCopy.DestinationTableName = "Person"; //设置列映射 bulkCopy.ColumnMappings.Add("Name", "Name"); bulkCopy.ColumnMappings.Add("Age", "Age"); bulkCopy.WriteToServer(dt); } //提交事务 tran.Commit(); } catch (Exception ex) { //回滚事务 tran.Rollback(); throw ex; } finally { //关闭连接 conn.Close(); } ``` 以上示例代码仅供参考,实际应用中需要根据具体情况进行调整。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值