SqlBulkCopy批量复制数据
在.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)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 黑麦和黑苦荞的区别?
- 下一篇: base target=_self是什么