CTOCIO IT专家网

天极传媒 比特网 | 天极网 | IT专家网 | IT商网 | 52PK游戏网 | 手机天极 | IT分众 |
IT专家网搜索

数据库 | Oracle | DB2 | SQL Server | MySQL | 商业智能 | BI | DBA | Sybase| SQL Server 2008

您现在的位置: IT专家网 > 数据库子站 > 数据库技巧

使用 Bulk Copy 将大量数据复制到数据库

作者: xiaotian,  出处:Blog, 责任编辑: 李书琴, 
2007-11-14 00:00
  如果一次要向数据库服务器提交多条记录 , 通常会执行多次Insert命令 , 这样就为要插入的每个记录执行一次与数据库服务器的往返 , 这就给服务器增加了压力 , 效率也大大的降低了……

  如果一次要向数据库服务器提交多条记录 , 通常会执行多次Insert命令 , 这样就为要插入的每个记录执行一次与数据库服务器的往返 , 这就给服务器增加了压力 , 效率也大大的降低了...

  .Net FrameWork 2.0 新增功能 Bulk Copy 可以很快将大量数据加载到数据库中 , 现在利用这一新功能来实现上述功能.

  这里从 MS Sql Server 2000 的 NorthWind 的 Orders 表加载数据到 DateTable 模拟要向数据库服务器提交的多条记录集 . 用 Tempdb 库来模拟目标数据库服务器 .

  先在 Tempdb 建一个表 temp_orders

  USE TEMPDB
  CREATE TABLE TEMP_ORDERS
  (
  TEMP_ORDERID INT,
  TEMP_CUSTOMERID NCHAR(5),
  TEMP_ORDERDATE DATETIME,
  TEMP_SHIPNAME NVARCHAR(40)
  )下面为模拟程序
  protected void Page_Load(object sender, EventArgs e)
  {
  #region 从NorthWind的Orders表获取要插入的数据
  DataTable dtNorthWindOrders = new DataTable();
  using ( SqlConnection northWindConnection = new SqlConnection( "Data Source=.;Initial Catalog=NorthWind;Integrated Security=True" ) )
  {
  using ( SqlDataAdapter northWindAdapter = new SqlDataAdapter( "SELECT ORDERID,CUSTOMERID,ORDERDATE,SHIPNAME FROM ORDERS" , northWindConnection ) )
  {
  northWindAdapter.Fill( dtNorthWindOrders );
  }
  }
  #endregion
  using ( SqlConnection tempdbConnection = new SqlConnection( "Data Source=.;Initial Catalog=Tempdb;Integrated Security=True" ) )
  {
  tempdbConnection.Open( );
  using ( SqlTransaction tran = tempdbConnection.BeginTransaction( ) )
  {
  SqlBulkCopy bulkCopyOrders = new SqlBulkCopy( tempdbConnection , SqlBulkCopyOptions.Default , tran );
  bulkCopyOrders.DestinationTableName = "TEMP_ORDERS";
  //将数据源表字段和目标表的字段做个映射
  bulkCopyOrders.ColumnMappings.Add( "ORDERID" , "TEMP_ORDERID" );
  bulkCopyOrders.ColumnMappings.Add( "CUSTOMERID" , "TEMP_CUSTOMERID" );
  bulkCopyOrders.ColumnMappings.Add( "ORDERDATE" , "TEMP_ORDERDATE" );
  bulkCopyOrders.ColumnMappings.Add( "SHIPNAME" , "TEMP_SHIPNAME" );
  bulkCopyOrders.BulkCopyTimeout = 1000;
  //每处理10行触发一个事件向页面上输出一个消息
  bulkCopyOrders.SqlRowsCopied += new SqlRowsCopiedEventHandler( onRowsCopy );
  bulkCopyOrders.NotifyAfter = 10;
  try
  {
  bulkCopyOrders.WriteToServer( dtNorthWindOrders );
  tran.Commit( );
  }
  catch ( Exception ex )
  {
  Response.Write( ex.ToString( ) );
  }
  finally
  {
  dtNorthWindOrders = null;
  }
  }
  }
  }
  private void onRowsCopy ( object Sender , SqlRowsCopiedEventArgs args )
  {
  Response.Write("已复制:"+ args.RowsCopied.ToString( ) + "
" );

}

  通过SQL SERVER 事件探察器发现执行的SQL为:

  insert bulk TEMP_ORDERS ([TEMP_ORDERID] Int, [TEMP_CUSTOMERID] NChar(5) COLLATE Chinese_PRC_CI_AS, [TEMP_ORDERDATE] DateTime, [TEMP_SHIPNAME] NVarChar(40) COLLATE Chinese_PRC_CI_AS)

  通过运行程序可以看出这个速度是相当的快 , 使用这个方法的最大优点是 : 减少对数据库的访问次数 .

  WriteToServer不仅可以处理 DataTable 对象 , 还可以处理 DataReader , DataRow 对象数组 .

网友评论

笔名 
请您注意:遵守国家有关法律、法规,尊重网上道德,承担一切因您的行为而直接或间接引起的法律责任。    IT专家网友拥有管理笔名和留言的一切权利。
  • 周排行榜
  • 月排行榜

邮件订阅


    
天极服务 | 关于我们 | 网站律师 | 加入我们 | 联系我们 | 广告业务 | 友情链接 | 我要挑错
All Rights Reserved, Copyright 2004-2007, ChinaByte
渝ICP证B2-20030003号 如有意见请与我们联系 powered by 天极内容管理平台CMS4i