SqlBulkCopy批量插入数据

需求:读取传入的DataSet,将DataSet里的DataTable插入数据库

分析:

1.数据量大,不推荐循环sql insert

2.多表操作,事务

  /// <summary>
        /// 添加数据
        /// </summary>
        /// <returns></returns>
        public static void AddTaxInfo(DataSet infoSet)
        {
            using (var conn = new SqlConnection(_connectionString))
            {
                conn.Open();
                SqlTransaction sqlbulkTransaction = conn.BeginTransaction();

                try
                {
                    //插入主表
                    using (var bulkCopy = new SqlBulkCopy(conn, SqlBulkCopyOptions.CheckConstraints, sqlbulkTransaction))
                    {
                        var table_Main = infoSet.Tables["Core_TaxMain"];
                        foreach (DataColumn dc in table_Main.Columns)
                        {
                            bulkCopy.ColumnMappings.Add(dc.ColumnName, dc.ColumnName);
                        }
                        bulkCopy.DestinationTableName = "Core_TaxMain";
                        //复制Table
                        bulkCopy.WriteToServer(table_Main);
                    }
                    //插入系表
                    using (var bulkCopy_ = new SqlBulkCopy(conn, SqlBulkCopyOptions.CheckConstraints, sqlbulkTransaction))
                    {
                        var table_Detail = infoSet.Tables["Core_TaxDetail"];
                        foreach (DataColumn dc in table_Detail.Columns)
                        {
                            bulkCopy_.ColumnMappings.Add(dc.ColumnName, dc.ColumnName);
                        }
                        bulkCopy_.DestinationTableName = "Core_TaxDetail";

                        bulkCopy_.WriteToServer(table_Detail);
                    }
                    //一个事务
                    sqlbulkTransaction.Commit();
                }
                catch (Exception)
                {
                    sqlbulkTransaction.Rollback();
                    throw;
                }
            }
        }

改进:上面的方法完全能够满足需求,只是创建bulkcopy对象显得重复,于是把数据库连接对象封装了一下。

封装好的类将写在另一篇博客里自己写的数据库工具类,这里直接调用:

public static void AddTaxInfo(DataSet infoSet)
        {
            var table_Main = infoSet.Tables["Core_TaxMain"];//主表
            var table_Detail = infoSet.Tables["Core_TaxDetail"];//系表
            using (SqlAccess client = new SqlAccess(_connectionString))//SqlAcess是封装类,类似SqlHelper
            {
                client.BeginTransaction();

                foreach (DataColumn dc in table_Main.Columns)
                {
                    client.BulkCopyColumnMapping.Add(dc.ColumnName, dc.ColumnName);
                }

                client.SetBulkCopy("a").WriteToServer(table_Main);

                foreach (DataColumn dc in table_Detail.Columns)
                {
                    client.BulkCopyColumnMapping.Add(dc.ColumnName, dc.ColumnName);
                }

                client.SetBulkCopy("b").WriteToServer(table_Detail);

                client.Commit();
            }



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值