天天看點

SqlBulkCopy批量複制資料

.Net1.1中無論是對于批量插入整個DataTable中的所有資料到資料庫中,還是進行不同資料源之間的遷移,都不是很友善。而 在.Net2.0中,SQLClient命名空間下增加了幾個新類幫助我們通過DataTable或DataReader批量遷移資料。資料源可以來自關 系資料庫或者XML檔案,甚至WebService傳回結果。其中最重要的一個類就是SqlBulkCopy類,使用它可以很友善的幫助我們把資料源的數 據遷移到目标資料庫中。

下面我們先通過一個簡單的例子說明這個類的使用:

首先:web.config

SqlBulkCopy批量複制資料

  < connectionStrings >

SqlBulkCopy批量複制資料

     < add  name ="srcDBConnection"  connectionString ="server=.;database=pubs;uid=sa;pwd=" />

SqlBulkCopy批量複制資料

     < add  name ="desDBConnection"  connectionString ="server=.;database=NorthWind;uid=sa;pwd=" />

SqlBulkCopy批量複制資料

   </ connectionStrings >

C#檔案: 前台不Copy了,就一個按鈕,一個Label

SqlBulkCopy批量複制資料

using  System;

SqlBulkCopy批量複制資料

using  System.Data;

SqlBulkCopy批量複制資料

using  System.Configuration;

SqlBulkCopy批量複制資料

using  System.Collections;

SqlBulkCopy批量複制資料

using  System.Web;

SqlBulkCopy批量複制資料

using  System.Web.Security;

SqlBulkCopy批量複制資料

using  System.Web.UI;

SqlBulkCopy批量複制資料

using  System.Web.UI.WebControls;

SqlBulkCopy批量複制資料

using  System.Web.UI.WebControls.WebParts;

SqlBulkCopy批量複制資料

using  System.Web.UI.HtmlControls;

SqlBulkCopy批量複制資料

using  System.Data.SqlClient;

SqlBulkCopy批量複制資料
SqlBulkCopy批量複制資料

public   partial   class  ASP_NET : System.Web.UI.Page

SqlBulkCopy批量複制資料

{

SqlBulkCopy批量複制資料

    private DateTime startTime;

SqlBulkCopy批量複制資料
SqlBulkCopy批量複制資料

    protected void Button1_Click(object sender, EventArgs e)

SqlBulkCopy批量複制資料

    {

SqlBulkCopy批量複制資料

        startTime = DateTime.Now;

SqlBulkCopy批量複制資料

        string srcConnString = "";

SqlBulkCopy批量複制資料

        string desConnString = "";

SqlBulkCopy批量複制資料

        SqlConnection srcConnection = new SqlConnection();

SqlBulkCopy批量複制資料

        SqlConnection desConnection = new SqlConnection();

SqlBulkCopy批量複制資料

        SqlCommand sqlcmd = new SqlCommand();

SqlBulkCopy批量複制資料

        SqlDataAdapter da = new SqlDataAdapter();

SqlBulkCopy批量複制資料

        DataTable dt = new DataTable();

SqlBulkCopy批量複制資料

        //srcConnString = ConfigurationManager.ConnectionStrings["srcDBConnection"].ConnectionString;

SqlBulkCopy批量複制資料

        desConnString = ConfigurationManager.ConnectionStrings["desDBConnection"].ToString();

SqlBulkCopy批量複制資料

        //srcConnection.ConnectionString = srcConnString;

SqlBulkCopy批量複制資料

        srcConnection.ConnectionString = desConnString;

SqlBulkCopy批量複制資料

        sqlcmd.Connection = srcConnection;

SqlBulkCopy批量複制資料

        //sqlcmd.CommandText = "select * from jobs";

SqlBulkCopy批量複制資料

        sqlcmd.CommandText = "select * from abc";

SqlBulkCopy批量複制資料

        sqlcmd.CommandType = CommandType.Text;

SqlBulkCopy批量複制資料

        sqlcmd.Connection.Open();

SqlBulkCopy批量複制資料

        da.SelectCommand = sqlcmd;

SqlBulkCopy批量複制資料

        da.Fill(dt);

SqlBulkCopy批量複制資料
SqlBulkCopy批量複制資料

        SqlBulkCopy sbc = new SqlBulkCopy(desConnString,SqlBulkCopyOptions.UseInternalTransaction);

SqlBulkCopy批量複制資料

        sbc.BulkCopyTimeout = 5000;

SqlBulkCopy批量複制資料

        sbc.SqlRowsCopied +=new SqlRowsCopiedEventHandler(OnRowsCopied);

SqlBulkCopy批量複制資料

        sbc.NotifyAfter = dt.Rows.Count;

SqlBulkCopy批量複制資料
SqlBulkCopy批量複制資料

        try

SqlBulkCopy批量複制資料

        {

SqlBulkCopy批量複制資料

           // sbc.DestinationTableName = "jobs";

SqlBulkCopy批量複制資料

            sbc.DestinationTableName = "bcd";

SqlBulkCopy批量複制資料

            sbc.WriteToServer(dt);

SqlBulkCopy批量複制資料

        }

SqlBulkCopy批量複制資料

        catch (Exception ex)

SqlBulkCopy批量複制資料

        {

SqlBulkCopy批量複制資料

            lblCounter.Text = ex.Message.ToString();

SqlBulkCopy批量複制資料

        }

SqlBulkCopy批量複制資料

        finally

SqlBulkCopy批量複制資料

        {

SqlBulkCopy批量複制資料

            sqlcmd.Clone();

SqlBulkCopy批量複制資料

            srcConnection.Close();

SqlBulkCopy批量複制資料

            desConnection.Close();

SqlBulkCopy批量複制資料
SqlBulkCopy批量複制資料

        }

SqlBulkCopy批量複制資料
SqlBulkCopy批量複制資料

    }

SqlBulkCopy批量複制資料

    private void OnRowsCopied(object sender, SqlRowsCopiedEventArgs args)

SqlBulkCopy批量複制資料

    {

SqlBulkCopy批量複制資料

        lblCounter.Text += args.RowsCopied.ToString() + " rows are copied<Br>";

SqlBulkCopy批量複制資料

        TimeSpan copyTime = DateTime.Now - startTime;

SqlBulkCopy批量複制資料

        lblCounter.Text += "Copy Time:" + copyTime.Seconds.ToString() + "." + copyTime.Milliseconds.ToString() + " seconds";

SqlBulkCopy批量複制資料

    }

SqlBulkCopy批量複制資料

}

SqlBulkCopy批量複制資料

代碼分析:

SqlBulkCopy批量複制資料

SqlBulkCopy sbc  =   new  SqlBulkCopy(desConnString,SqlBulkCopyOptions.UseInternalTransaction);

SqlBulkCopy批量複制資料

先生成SqlBulkCopy 執行個體,構造函數指定了目标資料庫,使用SqlBulkCopyOptions.UseInternalTransaction是指遷移動作指定在一個Transaction當中,如果資料遷移中産生錯誤或異常将發生復原。

SqlBulkCopy批量複制資料

sbc.BulkCopyTimeout = 5000000;    //指定操作完成的Timeout時間

SqlBulkCopy批量複制資料

 sbc.SqlRowsCopied  += new  SqlRowsCopiedEventHandler(OnRowsCopied);

SqlBulkCopy批量複制資料

  sbc.NotifyAfter  =  dt.Rows.Count;

SqlBulkCopy批量複制資料
SqlBulkCopy批量複制資料

         try

SqlBulkCopy批量複制資料

         {

SqlBulkCopy批量複制資料

           // sbc.DestinationTableName = "jobs";

SqlBulkCopy批量複制資料

            sbc.DestinationTableName = "bcd";

SqlBulkCopy批量複制資料

            sbc.WriteToServer(dt);

SqlBulkCopy批量複制資料

        }

SqlBulkCopy批量複制資料

NotifyAfter 屬性指定通知通知事件前處理的資料行數,在這裡指定為表的行數,并添加SqlRowsCopied事件輸出整個遷移過程的時間。 WriteToServer方法就是将資料源拷備到目标資料庫。在使用WriteToServer方法之前必須先指定 DestinationTableName屬性,也就是目标資料庫的表名,

SqlBulkCopy批量複制資料

性能方面:我在Sql中用proc插入68萬條資料花了近8分鐘,用SqlBulkCopy花了53.234秒~,效率高了7倍耶!不過現在也不做這方面的底層了,呵呵,把自己寫的一個測試存儲過程也貼上吧,友善自己學習

SqlBulkCopy批量複制資料

create   table  abc

SqlBulkCopy批量複制資料

(

SqlBulkCopy批量複制資料

  aid  int   identity ( 1 , 1 )  primary   key ,

SqlBulkCopy批量複制資料

  adesc  varchar ( 50 )  not   null

SqlBulkCopy批量複制資料

)

SqlBulkCopy批量複制資料

go

SqlBulkCopy批量複制資料
SqlBulkCopy批量複制資料
SqlBulkCopy批量複制資料

create   proc  addData

SqlBulkCopy批量複制資料

as

SqlBulkCopy批量複制資料

declare   @i   int

SqlBulkCopy批量複制資料

set   @i = 1

SqlBulkCopy批量複制資料

while   @i   <   1000000

SqlBulkCopy批量複制資料

begin

SqlBulkCopy批量複制資料

insert   into  abc  values  ( ' testDescription ' )

SqlBulkCopy批量複制資料

set   @i   =   @i   +   1

SqlBulkCopy批量複制資料

end

SqlBulkCopy批量複制資料

go

SqlBulkCopy批量複制資料
SqlBulkCopy批量複制資料

select   *   into  titles  from  pubs.dbo.titles  where    1 >   3  複制跨資料庫的表結構

js