科技行者

行者学院 转型私董会 科技行者专题报道 网红大战科技行者

知识库

知识库 安全导航

至顶网软件频道巧用Bulk Copy将大量的数据复制到数据库

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

  • 扫一扫
    分享文章到微信

  • 扫一扫
    关注官方公众号
    至顶头条

假如我们一次准备向数据库服务器提交多条记录 , 可能会执行多次Insert命令 , 但这样做就要为插入的每个记录执行一次与数据库服务器的往返 , 显然这会给服务器增加很多的压力。

作者:赛迪网 39311 来源:天新网 2008年3月25日

关键字: Mssql SQL Server SQL 数据库

  • 评论
  • 分享微博
  • 分享邮件

假如我们一次准备向数据库服务器提交多条记录 , 一般可能会执行多次Insert命令 , 但这样做就要为插入的每个记录执行一次与数据库服务器的往返 , 显然这会给服务器增加很多的压力 , 效率方面也会大大的降低。

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

这里从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领域最新产品与技术信息,那么订阅至顶网技术邮件将是您的最佳途径之一。

    重磅专题
    往期文章
    最新文章