您现在的位置是:首页 >

ios12.4数据迁移教程 使用SqlBulkCopy进行大批量数据迁移

火烧 2022-04-15 10:06:49 1040
使用SqlBulkCo y进行大批量数据迁移 下面我们先通过一个简单的例子说明这个类的使用 DateTime tartTime rotected void Butto _Click o ject e

使用SqlBulkCopy进行大批量数据迁移  

ios12.4数据迁移教程 使用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  
永远跟党走
  • 如果你觉得本站很棒,可以通过扫码支付打赏哦!

    • 微信收款码
    • 支付宝收款码