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

最近项目中使用到了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[]的操作,大家可以灵活运用.

C#sqlbulkcopy的优化的更多相关文章

  1. 闲谈SQL脚本优化

    摘要: 闲来无事,便想寻找大师级别优化SQL脚本案例,也算是读后留点笔记,摘录内容都会链接到所参考网址,如有冒犯,还望博主见谅:有些文章只有多动手多动脑才能理解其中的意思,看了需要实际操作,才不枉大师 ...

  2. net SqlBulkCopy拷贝数据的问题

    服务器配置:windows 2008 ,sql server 2008, oracle 10g. 在本地和同样配置的其他服务器上同样的程序,数据200万都很快就采集过来了,但是在发布的服务器上,如果b ...

  3. SQL优化 csdn

    1.1.1 摘要 在开发过程中,我们不时会遇到系统性能瓶颈问题,而引起这一问题原因可以很多,有可能是代码不够高效.有可能是硬件或网络问题,也有可能是数据库设计的问题. 本篇博文将针对一些常用的数据库性 ...

  4. EF结合SqlBulkCopy在项目中的使用

    这是我第一次写博客,由于水平有限,写不出什么好东西,还望见谅. 我现在参与的这个项目采用的是EF框架,方便了数据库的访问.但在实际中,发现项目中导入市县Excel数据耗时太长,于是趁这段时间专门研究了 ...

  5. EF结合SqlBulkCopy

    EF结合SqlBulkCopy在项目中的使用 这是我第一次写博客,由于水平有限,写不出什么好东西,还望见谅. 我现在参与的这个项目采用的是EF框架,方便了数据库的访问.但在实际中,发现项目中导入市县E ...

  6. MSSQL数据批量插入优化详细

    序言 现在有一个需求是将10w条数据插入到MSSQL数据库中,表结构如下,你会怎么做,你感觉插入10W条数据插入到MSSQL如下的表中需要多久呢? 或者你的批量数据是如何插入的呢?我今天就此问题做个探 ...

  7. SqlBulkCopy效率低下原因分析

    看到标题 应该会奇怪 SqlBulkCopy 为什么会效率低下 场景:接手项目 数据库SQLSERVER2008R2,  目前有一张流水表单表数据超过4亿,表中建有索引,有其他模块对这个表进行查询操作 ...

  8. C# 使用 SqlBulkCopy 类批量复制数据到数据库

    最近公司需要优化导入的问题,由于之前使用的方式是生成 Insert 语句插入数据库,数据量小的时候还行,但是随着发展数据量渐渐大了,之前的方法性能就跟不上了,于是发现了 SqlBulkCopy 这个类 ...

  9. SQL海量数据读写性能优化

    这是给某数据中心做的一个项目,项目难度之大令人发指,这个项目真正的让我感觉到了,商场如战场,而我只是其中的一个小兵,太多的战术,太多的高层之间的较量,太多的内幕了.具体这个项目的情况,我有空再写相关的 ...

随机推荐

  1. Android系统SVC命令教程

    svc命令,位置在/system/bin目录下,用来管理电源控制,无线数据,WIFI # svc svc Available commands: help Show information about ...

  2. 编译linux内核问题

    1: openssl/opensslv.h: No such file or directory sudo apt-get install libssl-dev 2:一般配置内核树,需要先make o ...

  3. APACHE 403 FORBIDDEN错误的解决办法之一

    打开 apache的配置文件httpd.conf,找到这段代码: Options FollowSymLinksAllowOverride NoneOrder deny,allowDeny from a ...

  4. Qt实现指定线程执行回调

    说明 同线程时,直接调用回调(block参数没意义) 创建invoker所在的线程,需要有Qt的消息循环(比如UI线程) 直接上代码 typedef std::function<void()&g ...

  5. FineUI Grid控件右键菜单的实现

    FineUI官方Demo上一直没有Grid右键菜单的实现,其实从4.1.x的版本开始,允许添加自定义的事件监听(Listeners),所以要实现这个功能已经相当容易了. ExtJs右键菜单有很多种,对 ...

  6. DataGridView 的cell赋值没有线程间访问的限制吗?

    1.如下代码,对DataGridView 的cell赋值不会出现线程访问问题,为什么呢? public Form1() { InitializeComponent(); } private void ...

  7. 2436: [Noi2011]Noi嘉年华 - BZOJ

    Description NOI2011 在吉林大学开始啦!为了迎接来自全国各地最优秀的信息学选手,吉林大学决定举办两场盛大的 NOI 嘉年华活动,分在两个不同的地点举办.每个嘉年华可能包含很多个活动, ...

  8. JNI中使用cl命令生成DLL文件

    问题描述:     在使用JNI调用DLL时,首先需要生成DLL文件 问题解决:     (1)现在使用VS2008的cl.exe程序,生成DLL文件 (1.1)cl.exe环境搭建 注:   cl. ...

  9. javascript中alert()与console.log()的区别

    我们在做js调试的时候使用 alert 可以显示信息,调试程序,alert 弹出窗口会中断程序, 如果要在循环中显示信息,手点击关闭窗口都累死.而且 alert 显示对象永远显示为[object ]. ...

  10. .run文件安装

    比如realplay.run 安装方法如下 chmod +x realplay.run ./realplay.run 然后他就会执行安装了,在过程中可能会要求你输入yes或no 安装完后就可以用了