转自:http://blog.csdn.net/huaer1011/article/details/2312361

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

首先:web.config

  1. <connectionStrings>
  2. <add name="srcDBConnection" connectionString="server=.;database=pubs;uid=sa;pwd="/>
  3. <add name="desDBConnection" connectionString="server=.;database=NorthWind;uid=sa;pwd="/>
  4. </connectionStrings>

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

  1. using System;
  2. using System.Data;
  3. using System.Configuration;
  4. using System.Collections;
  5. using System.Web;
  6. using System.Web.Security;
  7. using System.Web.UI;
  8. using System.Web.UI.WebControls;
  9. using System.Web.UI.WebControls.WebParts;
  10. using System.Web.UI.HtmlControls;
  11. using System.Data.SqlClient;
  12.  
  13. public partial class ASP_NET : System.Web.UI.Page
  14. {
  15. private DateTime startTime;
  16.  
  17. protected void Button1_Click(object sender, EventArgs e)
  18. {
  19. startTime = DateTime.Now;
  20. string srcConnString = "";
  21. string desConnString = "";
  22. SqlConnection srcConnection = new SqlConnection();
  23. SqlConnection desConnection = new SqlConnection();
  24. SqlCommand sqlcmd = new SqlCommand();
  25. SqlDataAdapter da = new SqlDataAdapter();
  26. DataTable dt = new DataTable();
  27. //srcConnString = ConfigurationManager.ConnectionStrings["srcDBConnection"].ConnectionString;
  28. desConnString = ConfigurationManager.ConnectionStrings["desDBConnection"].ToString();
  29. //srcConnection.ConnectionString = srcConnString;
  30. srcConnection.ConnectionString = desConnString;
  31. sqlcmd.Connection = srcConnection;
  32. //sqlcmd.CommandText = "select * from jobs";
  33. sqlcmd.CommandText = "select * from abc";
  34. sqlcmd.CommandType = CommandType.Text;
  35. sqlcmd.Connection.Open();
  36. da.SelectCommand = sqlcmd;
  37. da.Fill(dt);
  38.  
  39. SqlBulkCopy sbc = new SqlBulkCopy(desConnString,SqlBulkCopyOptions.UseInternalTransaction);
  40. sbc.BulkCopyTimeout = ;
  41. sbc.SqlRowsCopied +=new SqlRowsCopiedEventHandler(OnRowsCopied);
  42. sbc.NotifyAfter = dt.Rows.Count;
  43.  
  44. try
  45. {
  46. // sbc.DestinationTableName = "jobs";
  47. sbc.DestinationTableName = "bcd";
  48. sbc.WriteToServer(dt);
  49. }
  50. catch (Exception ex)
  51. {
  52. lblCounter.Text = ex.Message.ToString();
  53. }
  54. finally
  55. {
  56. sqlcmd.Clone();
  57. srcConnection.Close();
  58. desConnection.Close();
  59.  
  60. }
  61.  
  62. }
  63. private void OnRowsCopied(object sender, SqlRowsCopiedEventArgs args)
  64. {
  65. lblCounter.Text += args.RowsCopied.ToString() + " rows are copied<Br>";
  66. TimeSpan copyTime = DateTime.Now - startTime;
  67. lblCounter.Text += "Copy Time:" + copyTime.Seconds.ToString() + "." + copyTime.Milliseconds.ToString() + " seconds";
  68. }
  69. }

代码分析:

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

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

 sbc.SqlRowsCopied +=new SqlRowsCopiedEventHandler(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倍耶!不过现在也不做这方面的底层了,呵呵,把自己写的一个测试存储过程也贴上吧,方便自己学习

  1. create table abc
  2. (
  3. aid int identity(,) primary key,
  4. adesc varchar() not null
  5. )
  6. go
  7.  
  8. /**********存储过程**********************/
  9. create proc addData
  10. as
  11. declare @i int
  12. set @i=
  13. while @i <
  14. begin
  15. insert into abc values ('testDescription')
  16. set @i = @i +
  17. end
  18. go
  19.  
  20. select * into titles from pubs.dbo.titles where > 复制跨数据库的表结构

ADO.NET 新特性之SqlBulkCopy(批量插入大量数据)的更多相关文章

  1. ADO.NET 新特性之SqlBulkCopy

    在.Net1.1中无论是对于批量插入整个DataTable中的所有数据到数据库中,还是进行不同数据源之间的迁移,都不是很方便.而 在.Net2.0中,SQLClient命名空间下增加了几个新类帮助我们 ...

  2. sql 中的Bulk和C# 中的SqlBulkCopy批量插入数据 ( 回顾 and 粗谈 )

    通常,我们会对于一个文本文件数据导入到数据库中,不多说,上代码. 首先,表结构如下.   其次,在我当前D盘中有个文本文件名为2.txt的文件. 在数据库中,可以这样通过一句代码插入. Bulk in ...

  3. ASP.Net 使用SqlBulkCopy批量插入

    批量插入,以前我的做法是生成一堆insert into的sql语句,然后用程序一次值行,来实现. 今天看到了ASP.Net里可以使用DataTable,先将数据写入到DataTable中,然后使用Sq ...

  4. SqlBulkCopy批量插入数据时,不执行触发器和约束的解决方法

    原文:SqlBulkCopy批量插入数据时,不执行触发器和约束的解决方法 在new SqlBulkCopy对象的时候,设置一下SqlBulkCopyOptions选项即可,按位或运算 SqlBulkC ...

  5. sqlbulkcopy 批量插入数据

    批量插入 Datetable数据  通过sqlbulkcopy 插入1百万条数据 用时 10秒钟 (有兴趣的小伙伴可以去测试) /// <summary> /// /// </sum ...

  6. MSSQL使用sqlbulkcopy批量插入数据

    具体代码如下: /// <summary> /// 批量插入数据到BayonetZipFailedPic表 /// </summary> /// <param name= ...

  7. sql server 使用SqlBulkCopy批量插入数据库

    sql server sqlbulkcopy 批量数据插入数据库使用的是System.Data.SqlClient中的 SqlBulkCopy批量数据插入数据库 sql server 使用SqlBul ...

  8. C#中的SqlBulkCopy批量插入数据

    在C#中,我们可以使用sqlBulkCopy去批量插入数据,其他批量插入方法不在讨论. 1 /// <summary> 2 /// SqlBulkCopy批量插入数据 3 /// < ...

  9. SQL-35 对于表actor批量插入如下数据,如果数据已经存在,请忽略,不使用replace操作

    题目描述 对于表actor批量插入如下数据,如果数据已经存在,请忽略,不使用replace操作CREATE TABLE IF NOT EXISTS actor (actor_id smallint(5 ...

随机推荐

  1. 【转】Linux I2C设备驱动编写(二)

    原文网址:http://www.cnblogs.com/biglucky/p/4059582.html 在(一)中简述了Linux I2C子系统的三个主要成员i2c_adapter.i2c_drive ...

  2. HDOJ(HDU) 1898 Sempr == The Best Problem Solver?(水题、、、)

    Problem Description As is known to all, Sempr(Liangjing Wang) had solved more than 1400 problems on ...

  3. adb shell am pm 用法

    Using activity manager (am) Within an adb shell, you can issue commands with the activity manager (a ...

  4. Diamond Armor - The most expensive Suit: 2.8 Mio Swiss Francs

    Diamond Armor - The most expensive Suit: 2.8 Mio Swiss Francs Diamond Armor

  5. flash 中无法导出swf文件的解决方法

    近一个星期,我的flash cs6一直导不出swf文件,郁闷了好长时间,今天终于在网上找到了解决办法:总结了一下,如下:      一.是把文字打散,变成形状.      二.是把汉字的字体设成fla ...

  6. Ajax之 beforeSend和complete longind制作

    p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 15.0px Consolas; min-height: 18.0px } p.p2 { margin: 0 ...

  7. VLC网页插件添加对火狐浏览器的支持

    原文转自:http://blog.csdn.net/gsls200808/article/details/25536113 1.用<embed>标签 下面这段代码只支持火狐,不支持IE & ...

  8. 百练2755 奇妙的口袋 【深搜】or【动规】or【普通递归】or【递推】

    总Time Limit:  10000ms  Memory Limit:  65536kB 有一个奇妙的口袋.总的容积是40,用这个口袋能够变出一些物品,这些物品的整体积必须是40.John如今有n个 ...

  9. Facebook的手游出海之道

    对于不同的游戏公司,面临的同一个问题就是怎样让海外玩家能够一眼在App中发现你,成为你的新用户:不仅如此,怎样留住这些用户,让他们成为你游戏的忠实玩家也是让全部游戏开发商困扰的一个问题. w=580& ...

  10. UML解惑:图说UML中的六大关系--转

    UML定义的关系主要有六种:依赖.类属.关联.实现.聚合和组合.这些类间关系的理解和使用是掌握和应用UML的关键,而也就是这几种关系,往往会让初学者迷惑.这里给出这六种主要UML关系的说明和类图描述, ...