C#sqlbulkcopy的优化

最近在进行项目的优化。现在部分数据的拷贝时间过长。需要进行上线前的优化,尝试,批次的数量和拷贝次数的之间的合理数值关系。

最近项目中使用到了SqlBulkCopy实现批量复制,在这里,我把部分代码筛选出来简单说明一下,希望对大家研究和使用SqlBulkCopy 有帮助.因为是筛选的代码,不是完整的方法,请大家尽量不要直接拷贝使用,这篇文章的目的上帮大家简单的理解SqlBulkCopy.

/*******************调用SqlBulkCopy实现DataTable到SQL的批量拷贝******************/
            if (SqlConn.State == ConnectionState.Closed)
            {
                SqlConn.Open();
            }

            //定义SQL事务并嵌入到批量拷贝的工作中
            SqlTransaction objSqlTran = SqlConn.BeginTransaction();

            //定义SqlBulkCopy:SqlConn为SqlConnection,SqlBulkCopyOptions枚举类型,objSqlTran为调用的事务
            SqlBulkCopy objSqlCopy = new SqlBulkCopy(SqlConn, SqlBulkCopyOptions.KeepIdentity, objSqlTran);

            //分批次拷贝的行数
            objSqlCopy.BatchSize = 10;
            objSqlCopy.BulkCopyTimeout = 240;
            //目标表名
            objSqlCopy.DestinationTableName = "DetailAccountReport";

            //源表对目标表字段的映射,因为默认是按顺序以及名字匹配,所以这步很重要
            objSqlCopy.ColumnMappings.Add("ProjectDefID", "ProjectDefID");
            objSqlCopy.ColumnMappings.Add("Num", "SumNum");
            objSqlCopy.ColumnMappings.Add("Money", "SumMoney");
            objSqlCopy.ColumnMappings.Add("Explain", "Explain");

            try
            {
                //将DataTabel类型的objDT作为源拷贝到目标表
                objSqlCopy.WriteToServer(objDT);
                objSqlTran.Commit();
            }
            catch
            {
                objSqlTran.Rollback();
            }
            finally
            {
                objSqlCopy.Close();
                SqlConn.Close();
            }

            return objDT;

 

说明://源表对目标表字段的映射,因为默认是按顺序以及名字匹配,所以这步很重要
            objSqlCopy.ColumnMappings.Add("ProjectDefID", "ProjectDefID");
            objSqlCopy.ColumnMappings.Add("Num", "SumNum");
            objSqlCopy.ColumnMappings.Add("Money", "SumMoney");
            objSqlCopy.ColumnMappings.Add("Explain", "Explain");

注意这里,前面是源表字段,后面是目标表字段.默认是按照顺序和名称匹配的形式,所以要求两个数据集的结构完全一致,但是在现实使用中,很少有完全一致的情况出现,所以这段代码尤其重要.


objSqlCopy.WriteToServer(objDT);

objDT是我们项目中在之前经过处理的DataTable, WriteToServer()支持对DataTable,DataReader,DataRow[]的操作,大家可以灵活运用.

转载于:https://www.cnblogs.com/wcLT/p/4248570.html

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值