下载本文档
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
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. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 专利申请代理服务协议书
- 多种形式消防队伍建设管理办法
- 南通市2024届高考考前押题卷 数学试题
- -物理|浙江强基联盟2024届高三上学期9月联考物理试卷及答案
- 稀有稀土金属压延加工材项目可行性报告
- 移动通讯用数字程控交换机项目可行性研究报告
- 奥美拉唑在运动医学中的应用探索
- 花生病害防治:科学种植新选择
- 股东会决议:审议资产重组
- 景县庙镇旭日媒炭转运站仓储项目环评报告
- 弱电设备维护保养计划
- IPQC培训教材(完整版)
- 沃尔玛食品安全五项行为准则
- 中国(海南)国际农业博览会策划方案
- 遮阳及电动遮阳帘施工方案
- 明朝尚书与都御史年表
- (完整版)隔音墙降噪方案书
- 神奇的中医-小学一年级特色课-课外知识拓展ppt课件
- 平安基础性向测试IQ测试 试题及答案
- 盐酸安全警示牌
- 动火证表格样式.doc
评论
0/150
提交评论