您现在的位置是:首页
>
ios12.4数据迁移教程 使用SqlBulkCopy进行大批量数据迁移
使用SqlBulkCo y进行大批量数据迁移 下面我们先通过一个简单的例子说明这个类的使用 DateTime tartTime rotected void Butto _Click o ject e
使用SqlBulkCopy进行大批量数据迁移

下面我们先通过一个简单的例子说明这个类的使用 DateTime startTime; protected void Button _Click(object sender EventArgs e) { startTime = DateTime Now; string SrcConString; string DesConString; SqlConnection SrcCon = new SqlConnection(); SqlConnection DesCon = new SqlConnection(); SqlCommand SrcCom = new SqlCommand(); SqlDataAdapter SrcAdapter = new SqlDataAdapter(); DataTable dt = new DataTable(); SrcConString = ConfigurationManager ConnectionStrings[ SrcDBConnectionString ] ConnectionString; DesConString = ConfigurationManager ConnectionStrings[ DesDBConnectionString ] ConnectionString; SrcCon ConnectionString = SrcConString; SrcCom Connection = SrcCon; SrcCom CommandText = SELECT * From [SrcTable] ; SrcCom CommandType = CommandType Text; SrcCom Connection Open(); SrcAdapter SelectCommand = SrcCom; SrcAdapter Fill(dt); SqlBulkCopy DesBulkOp; DesBulkOp = new SqlBulkCopy(DesConString SqlBulkCopyOptions UseInternalTransaction); DesBulkOp BulkCopyTimeout = ; DesBulkOp SqlRowsCopied += new SqlRowsCopiedEventHandler(OnRowsCopied); DesBulkOp NotifyAfter = dt Rows Count; try { DesBulkOp DestinationTableName = SrcTable ; DesBulkOp WriteToServer(dt); } catch (Exception ex) { } finally { SrcCon Close(); DesCon Close(); } } private void OnRowsCopied(object sender SqlRowsCopiedEventArgs args) { lblCounter Text += args RowsCopied ToString() + rows are copied ; 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 = ; 指定操作完成的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 ); 性能问题 我使用上面的例子测试 迁移了 万条左右的记录 花的时间不到一秒 应改说性能还是不错的 另外 使用SQL Profile监视迁移事件 可以看见请求记录非常少 只有几条而已 据说使用SqlBulkCopy可以大大减少数据迁移的时间 lishixinzhi/Article/program/net/201311/11914
很赞哦! (1040)