C#中海量數(shù)據(jù)的批量插入和更新[頂]_第1頁(yè)
C#中海量數(shù)據(jù)的批量插入和更新[頂]_第2頁(yè)
C#中海量數(shù)據(jù)的批量插入和更新[頂]_第3頁(yè)
C#中海量數(shù)據(jù)的批量插入和更新[頂]_第4頁(yè)
全文預(yù)覽已結(jié)束

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

1、對(duì)于海量數(shù)據(jù)的插入和更新,ADO.NET確實(shí)不如JDBC做到好,JDBC有統(tǒng)一的模型來(lái)進(jìn)行批操作.使用起來(lái)非常方便:PreparedStatementps=conn.prepareStatement("insertorupdatearg1,args2.");然后你就可以for(inti=0;i<1000000000000000;i+)ps.setXXX(realArg);ps.addBatch();if(i%500=0)/假設(shè)五百條提交一次ps.executeBatch();/clearParameBatchps.executeBatch();這樣的操作不僅帶來(lái)極度大

2、的性能,而且非常方便.按說(shuō),ADO.NET中,要實(shí)現(xiàn)這本¥的功能,應(yīng)該直接在Command接口中或DataAdapter接口中提供Addbat和CommitBat的API,但ADO.NET的卻并沒(méi)有這樣簡(jiǎn)單地實(shí)現(xiàn),而是要求開(kāi)發(fā)者通過(guò)復(fù)雜的變通方法.對(duì)于大量的才t入操作,可以利用一個(gè)空的DataTable加入要插入的行,達(dá)到一定數(shù)量提交后清空該表就行了,實(shí)現(xiàn)起來(lái)并不算復(fù)雜:DateTimebegin=DateTime.Now;stringconnectionString=;using(SqlConnectionconn=Iconn.Open();SqlDataAdaptersd=new

3、newSqlConnection(connectionString)sd.SelectCommand=newSqlDataAdapter();SqlCommand("selectdevid,data_time,data_valuefromCurrentTest",conn);sd.InsertCommand=newSqlCommand("insertintoCurrentTest(devid,data_time,data_value)"+"values(devid,data_time,data_value);",conn);sd.In

4、sertCommand.Parameters.Add("devid",SqlDbType.Char,18,"devid");sd.InsertCommand.Parameters.Add("data_time",SqlDbType.Char,19,"data_time");sd.InsertCommand.Parameters.Add("data_value",SqlDbType.Int,8,"data_value");sd.InsertCommand.UpdatedRowS

5、ource=UpdateRowSource.None;sd.UpdateBatchSize=0;百DataSetdataset=newDataSet();sd.Fill(dataset);Randomr=newRandom(1000);for(inti=0;i<100000;i+)object口row="DEVID"+i,DateTime.Now.ToString("yyyy-MM-ddHH:mm:r.Next(1,1000);dataset.Tables0.Rows.Add(row);if(i%300=0)sd.Update(dataset.Tables0

6、);dataset.Tables0.Clear();sd.Update(dataset.Tables0);dataset.Tables0.Clear();sd.Dispose();dataset.Dispose();conn.Close();=DateTime.Now-begin;="+ts.TotalMilliseconds);對(duì)于這個(gè)測(cè)t我插入10萬(wàn)條數(shù)據(jù)用時(shí)28秒.性能還算可圈可點(diǎn).但是對(duì)于批量更新,搜遍全球的例子,都是把記錄Fill到DataSet中然后牧舉rows來(lái)更新,就我這個(gè)小數(shù)據(jù)量的測(cè)試而言,把10萬(wàn)條數(shù)據(jù)Fill到DataSet中已經(jīng)不能工作,如果是百萬(wàn),千萬(wàn)如何操

7、作?難道一定先把要批操作的記錄先獲取到DataSet中?也就是我要更新哪些記錄就要選查詢這些記錄?于是我仍然利用一個(gè)空的DataTable來(lái)加入要更新的記錄:sd.SelectCommand=newSqlCommand("selectdevid,data_time,data_valuefromCurrentTestwhere1=0",conn);/1=0的條件保證取一個(gè)空表.sd.UpdateCommand=newSqlCommand("updateCurrentTestsetdata_time=data_time,data_value=data_valuewhe

8、redevid=devid",conn);sd.UpdateCommand.Parameters.Add("data_time",SqlDbType.Char,19,"data_time");sd.UpdateCommand.Parameters.Add("data_value",SqlDbType.Int,4,"data_value");sd.UpdateCommand.Parameters.Add("devid",SqlDbType.Char,20,"devid"

9、;);sd.UpdateCommand.UpdatedRowSource=UpdateRowSource.None;sd.UpdateBatchSize=0;for(inti=0;i<300;i+)dataset.Tables0.Rows.Add(row);)sd.Update(dataset.Tables0);先更新300條試試,如果成功再循環(huán)更新所有記錄,但提示插入操作需要InsertCommand,因?yàn)橐粋€(gè)空表然后AddRow操作,這時(shí)RowState是Added,如果這時(shí)Update到數(shù)據(jù)庫(kù),執(zhí)行的就是插入操作而無(wú)法更新.改成:for(inti=0;i<300;i+)row

10、=填入初始化的值;dataset.Tables0.Rows.Add(row);dataset.AcceptChanges();for(inti=0;i<300;i+)dataset.Tables0.Rowsix="xxxxxxx"sd.Update(dataset.Tables0);先在DataTable中插入數(shù)據(jù),然后用AcceptChanges(),修改RowState為UnChanged,再修改表中數(shù)據(jù)希望改變UnChanged狀態(tài),即將DataTable從Current狀態(tài)改為Original,然后再對(duì)DataTable的Row進(jìn)行更新,就能使Update成功

11、.但這樣做確實(shí)不方便.調(diào)整思路,先從數(shù)據(jù)庫(kù)中取200條(批更新的Size大小),直接得到一個(gè)Original的DataTable.sd.SelectCommand=newSqlCommand("selecttop200devid,data_time,data_valuefromCurrentTest",conn);DataSetdataset=newDataSet();sd.Fill(dataset);用這200個(gè)空間來(lái)放要更新的其它數(shù)據(jù)看看:for(inti=0;i<100;i+)dataset.Tables0.Rowsi.BeginEdit();22:22:22&

12、quot;dataset.Tables0.Rowsi"data_time"="2222-22-22dataset.Tables0.Rowsi"data_value"=100;dataset.Tables0.Rowsi"devid"="DEVID"+(i+10000);/更新DEVID10000至ijDEVID10200的記錄dataset.Tables0.Rowsi.EndEdit();sd.Update(dataset.Tables0);OK,成功,哈哈.把要更新的數(shù)據(jù)不斷往這個(gè)空間填,填滿就提交,這樣

13、更新100000條數(shù)據(jù)只要幾個(gè)循環(huán)就行了.DateTimebegin=DateTime.Now;stringconnectionString=""using(SqlConnectionconn=newSqlConnection(connectionString)conn.Open();newSqlDataAdapter();SqlDataAdaptersd=sd.SelectCommand=newSqlCommand("selecttop200devid,datatime,data_valuefromCurrentTest",conn);I一DataSe

14、tdataset=newDataSet();sd.Fill(dataset);Randomr=newRandom(1000);sd.UpdateCommand=newSqlCommand("updateCurrentTest+"setdata_time=data_time,data_value=data_valuewheredevid=devid",conn);sd.UpdateCommand.Parameters.Add("data_time",SqlDbType.Char,19,"data_time");sd.Updat

15、eCommand.Parameters.Add("data_value",SqlDbType.InIsd.UpdateCommand.Parameters.Add("devid",SqlDbType.Char,20,"devid");sd.UpdateCommand.UpdatedRowSource=UpdateRowSource.None;sd.UpdateBatchSize=0;I立for(intcount=0;count<100000;)for(inti=0;i<200;i+,count+)dataset.Tables0.Rowsi.BeginEdit();dataset.Tables0.Rowsi"data_time"="2222-22

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論