C#中海量数据的批量插入和更新[顶]_第1页
C#中海量数据的批量插入和更新[顶]_第2页
C#中海量数据的批量插入和更新[顶]_第3页
C#中海量数据的批量插入和更新[顶]_第4页
全文预览已结束

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、对于海量数据的插入和更新,ADO.NET确实不如JDBC做到好,JDBC有统一的模型来进行批操作.使用起来非常方便:PreparedStatementps=conn.prepareStatement("insertorupdatearg1,args2.");然后你就可以for(inti=0;i<1000000000000000;i+)ps.setXXX(realArg);ps.addBatch();if(i%500=0)/假设五百条提交一次ps.executeBatch();/clearParameBatchps.executeBatch();这样的操作不仅带来极度大

2、的性能,而且非常方便.按说,ADO.NET中,要实现这本¥的功能,应该直接在Command接口中或DataAdapter接口中提供Addbat和CommitBat的API,但ADO.NET的却并没有这样简单地实现,而是要求开发者通过复杂的变通方法.对于大量的才t入操作,可以利用一个空的DataTable加入要插入的行,达到一定数量提交后清空该表就行了,实现起来并不算复杂: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);对于这个测t我插入10万条数据用时28秒.性能还算可圈可点.但是对于批量更新,搜遍全球的例子,都是把记录Fill到DataSet中然后牧举rows来更新,就我这个小数据量的测试而言,把10万条数据Fill到DataSet中已经不能工作,如果是百万,千万如何操

7、作?难道一定先把要批操作的记录先获取到DataSet中?也就是我要更新哪些记录就要选查询这些记录?于是我仍然利用一个空的DataTable来加入要更新的记录:sd.SelectCommand=newSqlCommand("selectdevid,data_time,data_valuefromCurrentTestwhere1=0",conn);/1=0的条件保证取一个空表.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条试试,如果成功再循环更新所有记录,但提示插入操作需要InsertCommand,因为一个空表然后AddRow操作,这时RowState是Added,如果这时Update到数据库,执行的就是插入操作而无法更新.改成: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中插入数据,然后用AcceptChanges(),修改RowState为UnChanged,再修改表中数据希望改变UnChanged状态,即将DataTable从Current状态改为Original,然后再对DataTable的Row进行更新,就能使Update成功

11、.但这样做确实不方便.调整思路,先从数据库中取200条(批更新的Size大小),直接得到一个Original的DataTable.sd.SelectCommand=newSqlCommand("selecttop200devid,data_time,data_valuefromCurrentTest",conn);DataSetdataset=newDataSet();sd.Fill(dataset);用这200个空间来放要更新的其它数据看看: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,成功,哈哈.把要更新的数据不断往这个空间填,填满就提交,这样

13、更新100000条数据只要几个循环就行了.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. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论