程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 數據庫知識 >> SqlServer數據庫 >> 關於SqlServer >> 使用 Bulk Copy 將大量數據復制到數據庫

使用 Bulk Copy 將大量數據復制到數據庫

編輯:關於SqlServer


  如果一次要向數據庫服務器提交多條記錄 , 通常會執行多次Insert命令 , 這樣就為要插入的每個記錄執行一次與數據庫服務器的往返, 這就給服務器增加了壓力, 效率也大大的降低了...

  .Net FrameWork 2.0 新增功能 Bulk Copy 可以很快將大量數據加載到數據庫中, 現在利用這一新功能來實現上述功能.

  這裡從 MS SQL Server 2000 的 NorthWind 的 Orders 表加載數據到 DateTable 模擬要向數據庫服務器提交的多條記錄集 . 用 Tempdb 庫來模擬目標數據庫服務器 .

  先在 Tempdb 建一個表 temp_orders

USE TEMPDB
CREATE TABLE TEMP_ORDERS
(
    TEMP_ORDERID INT,
    TEMP_CUSTOMERID NCHAR(5),
    TEMP_ORDERDATE DATETIME,
    TEMP_SHIPNAME NVARCHAR(40)
)

  下面為模擬程序

    protected void Page_Load(object sender, EventArgs e)
    {
        #region 從NorthWind的Orders表獲取要插入的數據
        DataTable dtNorthWindOrders = new DataTable();
        using ( SqlConnection northWindConnection = new SqlConnection( "Data Source=.;Initial Catalog=NorthWind;Integrated Security=True" ) )
        {
            using ( SqlDataAdapter northWindAdapter = new SqlDataAdapter( "SELECT ORDERID,CUSTOMERID,ORDERDATE,SHIPNAME FROM ORDERS" , northWindConnection ) )
            {
                northWindAdapter.Fill( dtNorthWindOrders );
            }
        }
        #endregion
        using ( SqlConnection tempdbConnection = new SqlConnection( "Data Source=.;Initial Catalog=Tempdb;Integrated Security=True" ) )
        {
            tempdbConnection.Open( );
            using ( SqlTransaction tran = tempdbConnection.BeginTransaction( ) )
            {
                SqlBulkCopy bulkCopyOrders = new SqlBulkCopy( tempdbConnection , SqlBulkCopyOptions.Default , tran );
                bulkCopyOrders.DestinationTableName = "TEMP_ORDERS";
                //將數據源表字段和目標表的字段做個映射
                bulkCopyOrders.ColumnMappings.Add( "ORDERID" , "TEMP_ORDERID" );
                bulkCopyOrders.ColumnMappings.Add( "CUSTOMERID" , "TEMP_CUSTOMERID" );
                bulkCopyOrders.ColumnMappings.Add( "ORDERDATE" , "TEMP_ORDERDATE" );
                bulkCopyOrders.ColumnMappings.Add( "SHIPNAME" , "TEMP_SHIPNAME" );
                bulkCopyOrders.BulkCopyTimeout = 1000;
                //每處理10行觸發一個事件向頁面上輸出一個消息
                bulkCopyOrders.SqlRowsCopied += new SqlRowsCopIEdEventHandler( onRowsCopy );
                bulkCopyOrders.NotifyAfter = 10;
                try
                {
                    bulkCopyOrders.WriteToServer( dtNorthWindOrders );
                    tran.Commit( );
                }
                catch ( Exception ex )
                {
                    Response.Write( ex.ToString( ) );
                }
                finally
                {
                    dtNorthWindOrders = null;
                }
            }
        }
    }
    private void onRowsCopy ( object Sender , SqlRowsCopIEdEventArgs args )
    {
        Response.Write("已復制:<font color=red>"+ args.RowsCopIEd.ToString( ) + "</font><br />" );
    }



  通過SQL Server 事件探察器發現執行的SQL為:

insert bulk TEMP_ORDERS ([TEMP_ORDERID] Int, [TEMP_CUSTOMERID] NChar(5) COLLATE Chinese_PRC_CI_AS, [TEMP_ORDERDATE] DateTime, [TEMP_SHIPNAME] NVarChar(40) COLLATE Chinese_PRC_CI_AS)

  通過運行程序可以看出這個速度是相當的快 , 使用這個方法的最大優點是 : 減少對數據庫的訪問次數 .

  WriteToServer不僅可以處理 DataTable 對象 , 還可以處理 DataReader , DataRow 對象數組 .

 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved