1. 程式人生 > >C# 使用SqlBulkCopy類批量複製大資料

C# 使用SqlBulkCopy類批量複製大資料

 SqlBulkCopy使用使用用於自定義表型別作為儲存過程引數,批量寫入資料。
 
  如果,大家使用SQL Server 2008,它提供一個新的功能表變數(Table Parameters)可以將整個表資料彙集成一個引數傳遞給儲存過程或SQL語句。它的注意效能開銷是將資料彙集成引數(O(資料量))。
 
  現在,我們修改之前的程式碼,在SQL Server中定義我們的表變數,具體定義如下:
 -- =============================================
-- Author:        JKhuang
-- Create date: 08/16/2012
-- Description:    Declares a user table paramter.
-- =============================================
CREATE TYPE jk_users_bulk_insert AS TABLE (
    user_login varchar(60
),
    user_pass varchar(64),
    user_nicename varchar(50),
    user_email varchar(100),
    user_url varchar(100),
    user_activation_key varchar(60),
    user_status int,
    display_name varchar(250)
)
 
  上面,我們定義了一個表引數jk_users_bulk_insert,接著我們定義一個儲存過程接受表引數jk_users_bulk_insert,具體定義如下:
 -- =============================================
-- Author:        JKhuang
-- Create date: 08
/16/2012
-- Description:    Creates a stored procedure, receive
-- a jk_users_bulk_insert argument.
-- =============================================
CREATE PROCEDURE sp_insert_jk_users 
@usersTable jk_users_bulk_insert READONLY 
AS
INSERT INTO jk_users (user_login, user_pass, user_nicename, user_email, user_url, 
user_activation_key, user_status, display_name, user_registered) 
SELECT user_login, user_pass, user_nicename, user_email, user_url, 
user_activation_key, user_status, display_name, GETDATE() 
FROM @usersTable 
  接下我們在客戶端程式碼中,呼叫儲存過程並且將表作為引數方式傳遞給儲存過程。
 var
 sw = Stopwatch.StartNew();
using (var conn = new SqlConnection(ConfigurationManager.ConnectionStrings["SQLCONN2"].ToString()))
{
    conn.Open();
    //// Invokes the stored procedure.    using (var cmd = new SqlCommand("sp_insert_jk_users", conn))
    {
        cmd.CommandType = CommandType.StoredProcedure;
        //// Adding a "structured" parameter allows you to insert tons of data with low overhead        var param = new SqlParameter("@userTable", SqlDbType.Structured) { Value = dt };
        cmd.Parameters.Add(param);
        cmd.ExecuteNonQuery();
    }
}
sw.Stop(); 
  現在,我們重新執行寫入操作發現寫入效率與SqlBulkCopy相當。