当前位置:首页 > 网络编程 > WEB编程 > ASP.net >  .net2.0中使用SqlBulkCopy进行大批量数据迁移 (2)

 .net2.0中使用SqlBulkCopy进行大批量数据迁移 (2)

点击次数:25 次 发布日期:2008-11-26 12:14:57 作者:源代码网
源代码网推荐      lblResult.Text = ex.Message;
源代码网推荐   }
源代码网推荐   finally
源代码网推荐   {
源代码网推荐   SrcCon.Close();
源代码网推荐   DesCon.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 DesBulkOp;
源代码网推荐  DesBulkOp = new SqlBulkCopy(DesConString, SqlBulkCopyOptions.UseInternalTransaction);先生成SqlBulkCopy 实例,构造函数指定了目标数据库,使用SqlBulkCopyOptions.UseInternalTransaction是指迁移动作指定在一个Transaction当中,如果数据迁移中产生错误或异常将发生回滚。其他选项请参考MSDN。
源代码网推荐  
源代码网推荐  DesBulkOp.BulkCopyTimeout = 500000000;
源代码网推荐  指定操作完成的Timeout时间
源代码网推荐  
源代码网推荐   DesBulkOp.SqlRowsCopied += new SqlRowsCopiedEventHandler(OnRowsCopied);
源代码网推荐   DesBulkOp.NotifyAfter = dt.Rows.Count;
源代码网推荐   try
源代码网推荐   {
源代码网推荐   DesBulkOp.DestinationTableName = "SrcTable";
源代码网推荐   DesBulkOp.WriteToServer(dt);
源代码网推荐   }
源代码网推荐  NotifyAfter属性指定通知通知事件前处理的数据行数,在这里指定为表的行数,并添加SqlRowsCopied事件输出整个迁移过程的时间。WriteToServer方法就是将数据源拷备到目标数据库。在使用WriteToServer方法之前必须先指定DestinationTableName属性,也就是目标数据库的表名,
源代码网推荐  
源代码网推荐  我们还可以自己定义一个Transaction,例如:
源代码网推荐  
源代码网推荐  SqlTransaction Transaction;
源代码网推荐  Transaction =
源代码网推荐  SrcCom.Connection.BeginTransaction();
源代码网推荐  SqlBulkCopy DesBulkOp;
源代码网推荐  DesBulkOp = new SqlBulkCopy(new SqlConnection(DesConString),
源代码网推荐  SqlBulkCopyOptions.Default,
源代码网推荐  Transaction);
源代码网推荐  
源代码网推荐  try
源代码网推荐  {
源代码网推荐  //..
源代码网推荐  }
源代码网推荐  catch{}
源代码网推荐  finally
源代码网推荐  {
源代码网推荐  Transaction.Commit();
源代码网推荐  }
源代码网推荐  另外还有一个SqlBulkCopyColumnMapping类,可以让数据源字段映射到目标数据中命名不同的字段上。也就是说如果目标数据和源数据的列名不同时,可以用这个类进行映射:
源代码网推荐  SqlBulkCopyColumnMapping ColMap = new SqlBulkCopyColumnMapping("SrcCol", "DesCol");
源代码网推荐  DesBulkOp.ColumnMappings.Add(ColMap);
源代码网推荐  或者可以直接添加映射:
源代码网推荐  DesBulkOp.ColumnMappings.Add("SrcCol", "DesCol");
源代码网推荐  性能问题:
源代码网推荐  我使用上面的例子测试,迁移了2万条左右的记录,花的时间不到一秒,应改说性能还是不错的。另外,使用SQL Profile监视迁移事件,可以看见请求记录非常少,只有几条而已。据说使用SqlBulkCopy可以大大减少数据迁移的时间。
源代码网推荐  
源代码网推荐  
源代码网推荐  
源代码网推荐    做人要厚道,请注明转自酷网动力(www.ASPCOOL.COM)。
源代码网推荐


源代码网供稿.
网友评论 (0)
会员中心
网络编程
本站推荐
网络编程之精华