在.Net1.1中无论是对于批量插入整个DataTable中的所有数据到数据库中,还是进行不同数据源之间的迁移,都不是很方便。而 在.Net2.0中,SQLClient命名空间下增加了几个新类帮助我们通过DataTable或DataReader批量迁移数据。数据源可以来自关 系数据库或者XML文件,甚至WebService返回结果。其中最重要的一个类就是SqlBulkCopy类,使用它可以很方便的帮助我们把数据源的数 据迁移到目标数据库中。
下面我们先通过一个简单的例子说明这个类的使用:

首先:web.config

<connectionStrings>

    

<add name="srcDBConnection"connectionString="server=.;database=pubs;uid=sa;pwd="/>

    

<add name="desDBConnection"connectionString="server=.;database=NorthWind;uid=sa;pwd="/>

  

</connectionStrings>

C#文件: 前台不Copy了,就一个按钮,一个Label

usingSystem;

usingSystem.Data;

usingSystem.Configuration;

usingSystem.Collections;

usingSystem.Web;

usingSystem.Web.Security;

usingSystem.Web.UI;

usingSystem.Web.UI.WebControls;

usingSystem.Web.UI.WebControls.WebParts;

usingSystem.Web.UI.HtmlControls;

usingSystem.Data.SqlClient;

publicpartialclassASP_NET : System.Web.UI.Page

{

    

private DateTime startTime;

    

protected void Button1_Click(object sender, EventArgs e)

    

{

        startTime 

= DateTime.Now;

        

string srcConnString = "";

        

string desConnString = "";

        SqlConnection srcConnection 

= new SqlConnection();

        SqlConnection desConnection 

= new SqlConnection();

        SqlCommand sqlcmd 

= new SqlCommand();

        SqlDataAdapter da 

= new SqlDataAdapter();

        DataTable dt 

= new DataTable();

        

//srcConnString = ConfigurationManager.ConnectionStrings["srcDBConnection"].ConnectionString;

desConnString = ConfigurationManager.ConnectionStrings["desDBConnection"].ToString();

        

//srcConnection.ConnectionString = srcConnString;

srcConnection.ConnectionString = desConnString;

        sqlcmd.Connection 

= srcConnection;

        

//sqlcmd.CommandText = "select * from jobs";

sqlcmd.CommandText = "select * from abc";

        sqlcmd.CommandType 

= CommandType.Text;

        sqlcmd.Connection.Open();
        da.SelectCommand 

= sqlcmd;

        da.Fill(dt);
        SqlBulkCopy sbc 

= new SqlBulkCopy(desConnString,SqlBulkCopyOptions.UseInternalTransaction);

        sbc.BulkCopyTimeout 

= 5000;

        sbc.SqlRowsCopied 

+=new SqlRowsCopiedEventHandler(OnRowsCopied);

        sbc.NotifyAfter 

= dt.Rows.Count;

        

try

        

{

           

// sbc.DestinationTableName = "jobs";

sbc.DestinationTableName = "bcd";

            sbc.WriteToServer(dt);
        }
        

catch (Exception ex)

        

{

            lblCounter.Text 

= ex.Message.ToString();

        }
        

finally

        

{

            sqlcmd.Clone();
            srcConnection.Close();
            desConnection.Close();
            
        }
    }
    

private void OnRowsCopied(object sender, SqlRowsCopiedEventArgs args)

    

{

        lblCounter.Text 

+= args.RowsCopied.ToString() + " rows are copied<Br>";

        TimeSpan copyTime 

= DateTime.Now - startTime;

        lblCounter.Text 

+= "Copy Time:" + copyTime.Seconds.ToString() + "." + copyTime.Milliseconds.ToString() + " seconds";

    }
}

代码分析:

SqlBulkCopy sbc =newSqlBulkCopy(desConnString,SqlBulkCopyOptions.UseInternalTransaction);

先生成SqlBulkCopy 实例,构造函数指定了目标数据库,使用SqlBulkCopyOptions.UseInternalTransaction是指迁移动作指定在一个Transaction当中,如果数据迁移中产生错误或异常将发生回滚。

sbc.BulkCopyTimeout = 5000000;    //指定操作完成的Timeout时间

sbc.SqlRowsCopied +=newSqlRowsCopiedEventHandler(OnRowsCopied);

  sbc.NotifyAfter 

=dt.Rows.Count;

        

try

        

{

           

// sbc.DestinationTableName = "jobs";

sbc.DestinationTableName = "bcd";

            sbc.WriteToServer(dt);
        }
NotifyAfter 属性指定通知通知事件前处理的数据行数,在这里指定为表的行数,并添加SqlRowsCopied事件输出整个迁移过程的时间。 WriteToServer方法就是将数据源拷备到目标数据库。在使用WriteToServer方法之前必须先指定 DestinationTableName属性,也就是目标数据库的表名,

性能方面:我在Sql中用proc插入68万条数据花了近8分钟,用SqlBulkCopy花了53.234秒~,效率高了7倍耶!不过现在也不做这方面的底层了,呵呵,把自己写的一个测试存储过程也贴上吧,方便自己学习

createtableabc

(
  aid 

intidentity(1,1) primarykey,

  adesc 

varchar(50) notnull

)

go

/**********存储过程**********************/

createprocaddData

as

declare@iint

set@i=1

while@i<1000000

begin

insertintoabc values('testDescription')

set@i=@i+1

end

go

select*intotitles frompubs.dbo.titles where1>3复制跨数据库的表结构

转自http://blog.csdn.net/huaer1011/archive/2008/04/21/2312361.aspx

SqlBulkCopy批量复制数据相关推荐

  1. .net2.0中SqlBulkCopy批量复制数据出错原因分析!

    在项目后台数据库选择SqlServer,进行批量复制数据时,.net2.0中提供的SqlBulkCopy不失为一个好的选择,性能相当可观;最近亲手实验一把,效果不错,大家可以参见http://www. ...

  2. SqlBulkCopy 批量复制数据到数据表

    使用 SqlBulkCopy 类只能向 SQL Server 表写入数据.但是,数据源不限于 SQL Server:可以使用任何数据源,只要数据可加载到 DataTable 实例或可使用 IDataR ...

  3. 使用asp.net 2.0中的SqlBulkCopy类批量复制数据

    介绍: 在软件开发中,把数据从一个地方复制到另一个地方是一个普遍的应用. 在很多不同的场合都会执行这个操作,包括旧系统到新系统的移植,从不同的数据库备份数据和收集数据. ASP.NET 2.0有一个S ...

  4. 用.net中的SqlBulkCopy类批量复制数据 (转载)

    在软件开发中,把数据从一个地方复制到另一个地方是一个普遍的应用. 在很多不同的场合都会执行这个操作,包括旧系统到新系统的移植,从不同的数据库备份数据和收集数据. .NET 2.0有一个SqlBulkC ...

  5. SqlBulkCopy批量插入数据

    利用SqlBulkCopy快速大批量导入数据 protected void Button1_Click(object sender, EventArgs e) {          DateTime ...

  6. C#使用SqlTransaction事务回滚与SqlBulkCopy批量插入数据

    C#中批量处理数据,有时候因为一条记录导致整个批量处理失败.这时候肯能会导致数据不全等问题,这时候我们可以使用SqlTransaction来进行事务回滚,即是要么全部成功要么全部不成功.如下代码 // ...

  7. sqlserver:使用 SqlBulkCopy 批量插入数据

    环境: window 10 sqlserver 2014 参考: <博文:SqlBulkCopy使用注意事项> 1. 问题场景 在批量迁移或导入数据时,我们可能会遇到插入大量数据的问题,比 ...

  8. sqlbulkcopy mysql_SqlBulkCopy 批量复制数据到数据库

    1.简介 核心方法:SqlBulkCopy.WriteToServer 将所有行从数据源复制到 SqlBulkCopy 对象的 DestinationTableName 属性指定的目标表中. 2.一句 ...

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

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

最新文章

  1. Oracle数据库查看表空间是否为自增的
  2. 统计学常犯的18个错误,请务必跳过这些坑!
  3. 互联网协议 — TCP — 性能问题解析
  4. delphi memo 查找字符 下行插入_Vim高手,从来不用鼠标2——替换、撤销、缩进、查找
  5. opeansea, nft, trend
  6. cannot resolve symbol ‘springframework‘
  7. android系统五大布局,android 五大布局文件
  8. 图像处理与图像识别笔记(五)图像增强2
  9. 2021年高考理综单科成绩查询,2021年高考总分是多少 2021年高考各科满分多少分...
  10. python lxml用法详解_Python-- lxml用法
  11. sharepoint安装心得-.net与sharepoint安装 sharepoint安装心得_过程(一)
  12. 计算与编程思维-Python实践【Python Crash Course】
  13. 校园导航系统之用弗洛伊德算法求加权图的最短路径
  14. 前端二面必会面试题(附答案)
  15. Python获取下周一日期
  16. 【ES6】Promise
  17. Laya-关于预设入门
  18. STM32笔记20--电容触摸实验/IIC协议
  19. 目前市面上堡垒机的品牌有哪些?采购时候需要考虑哪些?
  20. 现实世界的映射与超越:电子游戏的叙事研究

热门文章

  1. c++如何定义一个只能在堆上(栈上)生成对象的类?
  2. c++ assert()断言
  3. QT的QMultiHash类的使用
  4. c语言文本按行分配数组元素,【转】C语言中动态分配数组
  5. 「JupyterNotebook-bug」Jupyter Notebook卸载已安装的第三方库不能输入yes的问题
  6. SparkSQL发展历史,DataFrame,SparkSQL的数据源,运行框架,tree和rule,Rule,Context运行过程,hiveContext运行过程,SparkSQL CLI等
  7. SQLite 创建表(http://www.w3cschool.cc/sqlite/sqlite-create-table.html)
  8. Python数据分析之初识numpy常见方法使用案例
  9. 线性代数之矩阵导数微分
  10. Anaconda 安装 Python 库(MySQLdb)的方法