使用 SqlBulkCopy進行大量複製

  • 551
  • 0
  • 2019-03-19

使用 SqlBulkCopy進行大量複製

SqlBulkCopy這個物件可以讓我們大量複製資料, 執行速度非常的快, 我自己實測寫入了一百多萬筆的資料, 原本要花費至少要40分鐘, 但最後只用了一分鐘又十秒, 對於大量批次寫入真的很實用, 不過目的地的資料庫必須是SQL Server, 因為 SqlBulkCopy只能使用 SqlConnection 來作業

        static void Main(string[] args)
        {
            DateTime CopyStartTime;

            //連線到來源資料庫
            using (SqlConnection cnSource = new SqlConnection(“Data Source=SourceDB;Initial Catalog=SourceDBName;Persist Security Info=True;User ID=uid;Password=pwd”))
            {
                cnSource.Open();
                using (SqlCommand cmdSource = new SqlCommand(““, cnSource))
                {
                    //連線到目的資料庫
                    using (SqlConnection cnDestination = new SqlConnection(“Data Source=DestinationDB;Initial Catalog=DestinationDBName;Persist Security Info=True;User ID=uid;Password=pwd”))
                    {
                        cnDestination.Open()
                        //取得來要複製的資料表中, 有幾筆資料
                        cmdSource.CommandText = “SELECT COUNT(*) FROM SampleData”;
                        Console.WriteLine(“Total Rows:{0}”, cmdSource.ExecuteScalar().ToString());
                        //建立 SqlBulkCopy 物件
                        SqlBulkCopy sqlBulkCopy = new SqlBulkCopy(cnDestination);
                        //設定每個批次要複製的筆數
                        sqlBulkCopy.BatchSize = 3000;
                        //time out
                        sqlBulkCopy.BulkCopyTimeout = 100;
                        //目的地的資料表
                        sqlBulkCopy.DestinationTableName = “dbo.SampleData”;
                        //設定當SqlBulkCopy複製多少筆資料後, 觸發通知事件
                        sqlBulkCopy.NotifyAfter = 300000;
                        sqlBulkCopy.SqlRowsCopied += new SqlRowsCopiedEventHandler(sqlBulkCopy_SqlRowsCopied);
                        //欄位對應
                        //sqlBulkCopy.ColumnMappings.Add(“ID”, “ID”);
                        //sqlBulkCopy.ColumnMappings.Add(“Name”, “Name”);
                        //sqlBulkCopy.ColumnMappings.Add(“PurchaseDate”, “PurchaseDate”);

                        CopyStartTime = DateTime.Now;
                        cmdSource.CommandText = “SELECT * FROM SampleData”;
                        using (SqlDataReader drd = cmdSource.ExecuteReader())
                        {
                            sqlBulkCopy.WriteToServer(drd);
                        }
                        Console.WriteLine(“All Rows Copied. It spend {0} seconds.”, new TimeSpan(DateTime.Now.Ticks - CopyStartTime.Ticks).TotalSeconds);
                        Console.ReadLine();
                    }
                }
            }
        }

        private static void sqlBulkCopy_SqlRowsCopied(object sender, SqlRowsCopiedEventArgs e)
        {
            Console.WriteLine(“{0} Rows Copied”, e.RowsCopied);
        }

執行結果如下完整的程式碼, 放在 Gist

https://gist.github.com/ed0507/edbb5a5e7d97ebf6c2d6e791049548e7