日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

SqlBulkCopy批量复制数据

發(fā)布時間:2024/9/20 编程问答 39 豆豆
生活随笔 收集整理的這篇文章主要介紹了 SqlBulkCopy批量复制数据 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

在.Net1.1中無論是對于批量插入整個DataTable中的所有數(shù)據(jù)到數(shù)據(jù)庫中,還是進行不同數(shù)據(jù)源之間的遷移,都不是很方便。而 在.Net2.0中,SQLClient命名空間下增加了幾個新類幫助我們通過DataTable或DataReader批量遷移數(shù)據(jù)。數(shù)據(jù)源可以來自關(guān) 系數(shù)據(jù)庫或者XML文件,甚至WebService返回結(jié)果。其中最重要的一個類就是SqlBulkCopy類,使用它可以很方便的幫助我們把數(shù)據(jù)源的數(shù) 據(jù)遷移到目標數(shù)據(jù)庫中。
下面我們先通過一個簡單的例子說明這個類的使用:

首先:web.config

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

C#文件: 前臺不Copy了,就一個按鈕,一個Label

usingSystem;usingSystem.Data;usingSystem.Configuration;usingSystem.Collections;usingSystem.Web;usingSystem.Web.Security;usingSystem.Web.UI;usingSystem.Web.UI.WebControls;usingSystem.Web.UI.WebControls.WebParts;usingSystem.Web.UI.HtmlControls;usingSystem.Data.SqlClient;publicpartialclassASP_NET?:?System.Web.UI.Page{????private?DateTime?startTime;????protected?void?Button1_Click(object?sender,?EventArgs?e)????{????????startTime?=?DateTime.Now;????????string?srcConnString?=?"";????????string?desConnString?=?"";????????SqlConnection?srcConnection?=?new?SqlConnection();????????SqlConnection?desConnection?=?new?SqlConnection();????????SqlCommand?sqlcmd?=?new?SqlCommand();????????SqlDataAdapter?da?=?new?SqlDataAdapter();????????DataTable?dt?=?new?DataTable();????????//srcConnString?=?ConfigurationManager.ConnectionStrings["srcDBConnection"].ConnectionString;????????desConnString?=?ConfigurationManager.ConnectionStrings["desDBConnection"].ToString();????????//srcConnection.ConnectionString?=?srcConnString;????????srcConnection.ConnectionString?=?desConnString;????????sqlcmd.Connection?=?srcConnection;????????//sqlcmd.CommandText?=?"select?*?from?jobs";????????sqlcmd.CommandText?=?"select?*?from?abc";????????sqlcmd.CommandType?=?CommandType.Text;????????sqlcmd.Connection.Open();????????da.SelectCommand?=?sqlcmd;????????da.Fill(dt);????????SqlBulkCopy?sbc?=?new?SqlBulkCopy(desConnString,SqlBulkCopyOptions.UseInternalTransaction);????????sbc.BulkCopyTimeout?=?5000;????????sbc.SqlRowsCopied?+=new?SqlRowsCopiedEventHandler(OnRowsCopied);????????sbc.NotifyAfter?=?dt.Rows.Count;????????try????????{???????????//?sbc.DestinationTableName?=?"jobs";????????????sbc.DestinationTableName?=?"bcd";????????????sbc.WriteToServer(dt);????????}????????catch?(Exception?ex)????????{????????????lblCounter.Text?=?ex.Message.ToString();????????}????????finally????????{????????????sqlcmd.Clone();????????????srcConnection.Close();????????????desConnection.Close();????????????????????}????}????private?void?OnRowsCopied(object?sender,?SqlRowsCopiedEventArgs?args)????{????????lblCounter.Text?+=?args.RowsCopied.ToString()?+?"?rows?are?copied<Br>";????????TimeSpan?copyTime?=?DateTime.Now?-?startTime;????????lblCounter.Text?+=?"Copy?Time:"?+?copyTime.Seconds.ToString()?+?"."?+?copyTime.Milliseconds.ToString()?+?"?seconds";????}}

代碼分析:

SqlBulkCopy?sbc?=newSqlBulkCopy(desConnString,SqlBulkCopyOptions.UseInternalTransaction);先生成SqlBulkCopy?實例,構(gòu)造函數(shù)指定了目標數(shù)據(jù)庫,使用SqlBulkCopyOptions.UseInternalTransaction是指遷移動作指定在一個Transaction當中,如果數(shù)據(jù)遷移中產(chǎn)生錯誤或異常將發(fā)生回滾。

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

sbc.SqlRowsCopied?+=newSqlRowsCopiedEventHandler(OnRowsCopied);??sbc.NotifyAfter?=dt.Rows.Count;????????try????????{???????????//?sbc.DestinationTableName?=?"jobs";????????????sbc.DestinationTableName?=?"bcd";????????????sbc.WriteToServer(dt);????????}NotifyAfter 屬性指定通知通知事件前處理的數(shù)據(jù)行數(shù),在這里指定為表的行數(shù),并添加SqlRowsCopied事件輸出整個遷移過程的時間。 WriteToServer方法就是將數(shù)據(jù)源拷備到目標數(shù)據(jù)庫。在使用WriteToServer方法之前必須先指定 DestinationTableName屬性,也就是目標數(shù)據(jù)庫的表名,

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

createtableabc(??aid?intidentity(1,1)?primarykey,??adesc?varchar(50)?notnull)go/**********存儲過程**********************/createprocaddDataasdeclare@iintset@i=1while@i<1000000begininsertintoabc?values('testDescription')set@i=@i+1endgoselect*intotitles?frompubs.dbo.titles?where1>3復(fù)制跨數(shù)據(jù)庫的表結(jié)構(gòu)

轉(zhuǎn)自http://blog.csdn.net/huaer1011/archive/2008/04/21/2312361.aspx

總結(jié)

以上是生活随笔為你收集整理的SqlBulkCopy批量复制数据的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。