现在的位置: 首页 > 综合 > 正文

ADO.NET数据批量拷贝

2013年03月24日 ⁄ 综合 ⁄ 共 1470字 ⁄ 字号 评论关闭

SqlBulkCopy类提供批量数据的操作

两张表的结构必须相同,目标必须是MSSql,数据源可以任意。超大量数据可以分批拷贝。

1.先在一张表中插入万数量级数据,经过测试,每次插入的用时都不同,可能受到机器的运行程序的数量的影响。

基本上都是插入10万条数据用时40多秒到50多秒。

2.把插入的数据从数据库中读出来放到一个DataTable中,

            con1 = new SqlConnection(strCon1);          

            cmd = new SqlCommand("select * from tbl_Copy", con1);

            SqlDataAdapter adp = new SqlDataAdapter(cmd);

            DataTable dt = new DataTable();

            adp.Fill(dt);

 

             

            SqlBulkCopy LargeCopy ;

            LargeCopy = new SqlBulkCopy(strCon2,//要拷贝的数据库连接

            SqlBulkCopyOptions.UseInternalTransaction//每一批批量复制操作将在事务中发生。出错会回滚。不过我没验证^-^.

            );

            LargeCopy.BulkCopyTimeout = 100000;//超时之前操作完成所允许的秒数。如果操作超时,事务便不会提交,而且所有已复制的行都会从目标表中移除。

            LargeCopy.SqlRowsCopied+=new SqlRowsCopiedEventHandler(LargeCopy_SqlRowsCopied);

            //在每次处理完 NotifyAfter 属性指定的行数时发生。

            LargeCopy.NotifyAfter = dt.Rows.Count;//定义在生成通知事件之前要处理的行数。

            Application.DoEvents();

            try

            {

                LargeCopy.DestinationTableName = "tbl_Copy";//服务器上目标表的名称。

                LargeCopy.WriteToServer(dt);// 将所有行从数据源复制到 SqlBulkCopy 对象的 DestinationTableName 属性指定的目标表中。

            }

            catch(Exception CopyErr)

            {

 

            }

3.公共事件

public void LargeCopy_SqlRowsCopied(object sender,SqlRowsCopiedEventArgs args)

        {

            label1.Text = args.RowsCopied.ToString()+" rows are copid";

            TimeSpan ss =DateTime.Now.Subtract(sTime);

            label1.Text += "/n用时:"+ss.Milliseconds.ToString()+" 豪秒。";

        }

 

 

 

 

 

抱歉!评论已关闭.