.net2.0中使用SqlBulkCopy进行大批量数据迁移 (2)
点击次数:25 次 发布日期:2008-11-26 12:14:57 作者:源代码网
|
源代码网推荐 } 源代码网推荐 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)。 源代码网推荐 源代码网供稿. |
