两张表的结构必须相同,目标必须是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()+" 豪秒。";
}