天天看點

使用ADO.NET下的SqlBulkCopy類執行批量複制操作

很多時侯,我們需要在資料庫間複制大量資料,如SQLSERVER提供的BCP.EXE指令行工具,在ADO.NET下SqlBulkCopy類提供了一個高性能的方法WriteToServer來複制資料。該方法可以接受一個DataRow對像資料、一個實作IDbDataReader接口的對像和一個DataTable,或者接受一個DataTable對像和一個DataRowState枚舉值,以實作從大多數位置中擷取資料。

        /// <summary>

        /// 在目标資料庫與源資料庫之間批量複制資料

        /// </summary>

        /// <param name="SourceConnectionstr">源資料庫連接配接字元串</param>

        /// <param name="TargetConnectionstr">目标資料庫連接配接字元串</param>

        /// <param name="SourceSQLstr">查詢資料的SQL語句,必須包含主鍵,否則更新不成功,并無錯誤提示</param>

        /// <param name="TargetTableName">更新目标資料庫中的表名</param>

        /// <returns>Boolean</returns>

        public static Boolean dbtodb(string SourceConnectionstr,

        string TargetConnectionstr, string SourceSQLstr,

        string TargetTableName)

        {

            System.Data.SqlClient.SqlConnection SourceConn= new  System.Data.SqlClient.SqlConnection();

            System.Data.SqlClient.SqlConnection TargetConn = new System.Data.SqlClient.SqlConnection();

            try

            {

                SourceConn.ConnectionString = SourceConnectionstr;

                TargetConn.ConnectionString = TargetConnectionstr;

                System.Data.SqlClient.SqlCommand cmd = SourceConn.CreateCommand();

                cmd.CommandType = CommandType.Text;

                cmd.CommandText = SourceSQLstr;

                SourceConn.Open();

                TargetConn.Open();

                using (System.Data.SqlClient.SqlDataReader rdr = cmd.ExecuteReader())

                {

                    //MessageBox.Show (rdr.HasRows.ToString()) ;

                    if (!rdr.HasRows)

                    {

                        return false;

                    }

                    using (System.Data.SqlClient.SqlBulkCopy bc = new System.Data.SqlClient.SqlBulkCopy(TargetConn))

                    {

                        //逾時之前操作所允許完成的秒數

                        bc.BulkCopyTimeout = 360;

                        //目标伺服器上的表名

                        bc.DestinationTableName = TargetTableName;

                        bc.WriteToServer(rdr);                       

                    }

                }

            }

            catch

            {

                throw;

            }

            finally

            {

                //關閉連接配接

                SourceConn.Close();

                TargetConn.Close();

            }

            return true;

}

如果想以最少資源擷取最佳性能,就考濾使用IDbDateReader參數。

參考書ADO.NET進階程式設計(微軟技術叢書)