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

下载本文档

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

文档简介

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

2、仅带来极度大的性能,而且非常方便.按说,ADO.NET 中,要实现这本¥的功能,应该直接在Command 接口中或DataAdapter 接口中提供 Addbat 和CommitBat 的API,但ADO.NET 的却并没有这样简 单地实现,而是要求开发者通过 复杂的变通方法.对于大量的才t入操作,可以利用一个空的DataTable加入要插入的行,达到一定数量提交后清空该表就行了 ,实现起来并不算复杂:DateTime begin = DateTime.Now;string connectionString =; using (SqlConnection conn =I conn.O

3、pen();SqlDataAdapter sd =newnew SqlConnection(connectionString)sd.SelectCommand =newSqlDataAdapter();SqlCommand("select devid,data_time,data_value from CurrentTest", conn);sd.InsertCommand =newSqlCommand("insert into CurrentTest (devid,data_time,data_value)"+ " values (devid

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

5、"data_ value");sd.InsertCommand.UpdatedRowSource = UpdateRowSource.None;sd.UpdateBatchSize = 0;百DataSet dataset = new DataSet();sd.Fill(dataset);Random r = new Random(1000);for (int i = 0; i < 100000; i+)object 口 row = "DEVID"+i,DateTime.Now.ToString("yyyy-MM-dd HH:mm: r.

6、Next(1,1000) ;dataset.Tables0.Rows.Add(row);if (i % 300 = 0) sd.Update(dataset.Tables0);dataset.Tables0.Clear(); sd.Update(dataset.Tables0);dataset.Tables0.Clear();sd.Dispose();dataset.Dispose();conn.Close();=DateTime.Now - begin;="+ ts.TotalMilliseconds);对于这个测t我插入 10万条数据用时28秒.性能还算可圈可点.但是对于批量更新

7、,搜遍全球的 例子,都是把记录 Fill到DataSet中然后牧举rows来更新,就我这个小数据量的测试而言,把10万条数据Fill到DataSet中已经不能工作,如果是百万,千万如何操作?难道一定先把要批操作的记录先获取到DataSet中?也就是我要更新哪些记录就要选查询这些记录?于是我仍然利用一个空的DataTable来加入要更新的记录:sd.SelectCommand = new SqlCommand("select devid,data_time,data_value from CurrentTest where 1=0", conn);/1=0的条件保证取一个空表

8、.sd.UpdateCommand = new SqlCommand("update CurrentTest set data_time =data_time,data_value = data_value where devid = devid", conn);sd.UpdateCommand.Parameters.Add("data_time", SqlDbType.Char, 19, "data_time");sd.UpdateCommand.Parameters.Add("data_value", SqlD

9、bType.Int, 4,"data_value");sd.UpdateCommand.Parameters.Add("devid", SqlDbType.Char, 20,"devid");sd.UpdateCommand.UpdatedRowSource = UpdateRowSource.None;sd.UpdateBatchSize = 0;for(int i=0;i<300;i+) dataset.Tables0.Rows.Add(row); sd.Update(dataset.Tables0);先更新 300 条试试

10、,如果成功再循环更新所有记录, 但提示插入操作需要InsertCommand, 因为一个空表然后Add Row 操作 , 这时 RowState 是 Added,如果这时Update 到数据库,执行的就是插入操作而无法更新. 改成 :for(int i=0;i<300;i+)row = 填入初始化的值;dataset.Tables0.Rows.Add(row);dataset.AcceptChanges();for(int i=0;i<300;i+) dataset.Tables0.Rowsix = "xxxxxxx"sd.Update(dataset.Tabl

11、es0);先在 DataTable 中插入数据, 然后用 AcceptChanges(), 修改 RowState 为 UnChanged, 再修改表中数据希望改变UnChanged 状态 , 即将DataTable 从 Current 状态改为Original, 然后再对DataTable 的 Row 进行更新,就能使Update 成功.但这样做确实不方便.调整思路, 先从数据库中取200 条 ( 批更新的Size 大小 ), 直接得到一个Original 的 DataTable.sd.SelectCommand = new SqlCommand("select top 200de

12、vid,data_time,data_value from CurrentTest", conn);DataSet dataset = new DataSet();sd.Fill(dataset);用这 200 个空间来放要更新的其它数据看看:for (int i = 0; i < 100; i+)dataset.Tables0.Rowsi.BeginEdit();22:22:22"dataset.Tables0.Rowsi"data_time" = "2222-22-22dataset.Tables0.Rowsi"data_v

13、alue" = 100;dataset.Tables0.Rowsi"devid" = "DEVID"+(i+10000);/更新DEVID10000到 DEVID10200 的记录dataset.Tables0.Rowsi.EndEdit();sd.Update(dataset.Tables0);OK,成功,哈哈.把要更新的数据不断往这个空间填,填满就提交,这样更新100000 条数据只要几个循环就行了 .DateTime begin = DateTime.Now;string connectionString ="" us

14、ing (SqlConnection conn = new SqlConnection(connectionString)new SqlDataAdapter();conn.Open();sd.SelectCommand =SqlDataAdapter sd =new SqlCommand("select top 200 devid,data time,data_value from CurrentTest", conn);I 一DataSet dataset =new DataSet();sd.Fill(dataset);Random r = new Random(100

15、0);sd.UpdateCommand =new SqlCommand("update CurrentTest+ " set data_time = data_time,data_value = data_value where devid = devid", conn);sd.UpdateCommand.Parameters.Add("data_time", SqlDbType.Cha r, 19, "data_time");sd.UpdateCommand.Parameters.Add("data_value&

16、quot;, SqlDbType.InIsd.UpdateCommand.Parameters.Add("devid", SqlDbType.Char, 20, "devid");sd.UpdateCommand.UpdatedRowSource = UpdateRowSource.None;sd.UpdateBatchSize = 0;I 立for (int count = 0; count < 100000;) for (int i = 0; i < 200; i+,count+) dataset.Tables0.Rowsi.BeginEdit();dataset.Tables0.Rowsi"data_time" = &q

温馨提示

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

评论

0/150

提交评论