http://blog.csdn.net/lk103852503/article/details/6570748

修改一批要素的属性有多种方法,当数据量较大时,若选择不当可能会大大影响速度。

一、IRowBuffer 方法

此法适用于将一批数据更新为某一相同的属性。

IQueryFilter pFilter = new QueryFilterClass();
pFilter.WhereClause = "Z='T'";
pFilter.SubFields = "Z";
int nIndex = pFeatureClass.FindField("Z");
ITable pTable = pFeatureClass as ITable;
IRowBuffer pBuffer = pTable.CreateRowBuffer();
pBuffer.set_Value(nIndex, "TT");
pTable.UpdateSearchedRows(pFilter, pBuffer);
Marshal.ReleaseComObject(pFilter);

当所要更新的属性各不相同时,上述方法就不能用了。

二、逐条更新记录

这种方式中可有三种方法,如下:

(1)

for (int i = 0; i < pTable.RowCount(null); i++)
            {
                pRow = pTable.GetRow(i);
                pRow.set_Value(2, i + 6);
                pRow.Store();
            }

(2)

IFeatureCursor FCursor = pLayer.FeatureClass.Search(new QueryFilterClass(), false);
 IFeature feature = FCursor.NextFeature();

for (int i = 0; i < featureNum; i++)
            {

feature.set_Value(2, i);
                feature.Store();
                feature = FCursor.NextFeature();
            }

(3)

ICursor pCursor =pTable.Update(null, false);
            pRow = pCursor.NextRow();
            for (int i = 0; i < pTable.RowCount(null); i++)
            {
                pRow.set_Value(2, i + 6);
                pCursor.UpdateRow(pRow);
                pRow = pCursor.NextRow();

}
试验数据为320条记录,三种方法的运行时间为:法(1)为40297ms;法(2)34922ms为;法(3)为219ms.

可见运用IFeature和IRow的Store方法更新速度都很慢,用ICursor 的UpdateRow方法速度很快,分别是前两者效率的184倍、159倍!!完整测试代码如下:

IFeatureLayer pLayer = Utilities.GetLayerByName((string)cmbRegLayers.SelectedItem, m_mapControl) as IFeatureLayer;
            ITable pTable = pLayer.FeatureClass as ITable;
            int t = 0;

IFeatureCursor FCursor = pLayer.FeatureClass.Search(new QueryFilterClass(), false);
            IFeature feature = FCursor.NextFeature();
            int featureNum = pLayer.FeatureClass.FeatureCount(null);
            t = Environment.TickCount;
            for (int i = 0; i < featureNum; i++)
            {

feature.set_Value(2, i);
                feature.Store();
                feature = FCursor.NextFeature();
            }
            t = Environment.TickCount - t;
            MessageBox.Show(t.ToString());

t = Environment.TickCount;
            ICursor pCursor =pTable.Update(null, false);
            IRow pRow = pCursor.NextRow();
            for (int i = 0; i < pTable.RowCount(null); i++)
            {
                pRow.set_Value(2, i + 6);
                pCursor.UpdateRow(pRow);
                pRow = pCursor.NextRow();

}

t = Environment.TickCount - t;
            MessageBox.Show(t.ToString());

t = Environment.TickCount;
            for (int i = 0; i < pTable.RowCount(null); i++)
            {
                pRow = pTable.GetRow(i);
                pRow.set_Value(2, i + 6);
                pRow.Store();
            }

t = Environment.TickCount - t;
            MessageBox.Show(t.ToString());

Arcengine效率探究之二——属性的更新(转载)的更多相关文章

  1. 【转载】Arcengine效率探究之二——属性的更新

    文转载自hymyjl2010<Arcengine效率探究之二——属性的更新>   修改一批要素的属性有多种方法,当数据量较大时,若选择不当可能会大大影响速度. 一.IRowBuffer 方 ...

  2. Arcengine效率探究之一——属性的读取(转载)

    http://blog.csdn.net/lk103852503/article/details/6566652 在写一个对属性表的统计函数时,发现执行速度奇慢无比,百思不得其解,其实算法并不复杂,后 ...

  3. ArcGIS Engine效率探究——要素的添加和删除、属性的读取和更新

    ArcGIS Engine效率探究——要素的添加和删除.属性的读取和更新 来自:http://blog.csdn.net/freewaywalker/article/details/23703863 ...

  4. vue生命周期探究(二)

    vue生命周期探究(二) 转载自:https://segmentfault.com/a/1190000008923105 上一章我们介绍了vue的组件生命周期和路由勾子,这一章,让我们来看看在vue- ...

  5. 常用sql语句总结(二)(更新数据,序列,创建数据表,约束,注释)

    常用sql语句总结(二)(更新数据,序列,创建数据表,约束,注释) 一. 增 INSERT INTO 数据表(字段,字段,-) VALUES(值,值-); INSERT INTO emp(empno, ...

  6. fastJson在java后台转换json格式数据探究(二)--处理数组/List/Map

    作者:buster2014 推荐:长安散人 fastJson在java后台转换json格式数据探究(二)--处理数组/List/Map JSON字符串与Java对象的转换 1.将Java对象或Java ...

  7. 解决使用JPA时对象在set属性时更新了数据库问题

    https://www.jianshu.com/p/1100814ff54f 之前也遇到过一次这个问题,打印的日志中也可以看见update相关的sql语句,但当时不知道为什么会去自动更新,就用了别的方 ...

  8. vue 数组中嵌套的对象添加新属性--页面更新

    vue 数组中嵌套的对象添加新属性--页面更新:https://www.jianshu.com/p/8f0e5bb13735

  9. 支付宝防并发方案之"一锁二判三更新"

    每年支付宝在双11和双12的活动中,都展示了绝佳的技术能力.这个能力不但体现在处理高TPS量的访问,更体现在几乎不会出错,不会出现重复支付的情况,那这个是怎么做到的呢? 诚然,为了实现在高并发下仍不会 ...

随机推荐

  1. java使用elasticsearch进行模糊查询-已在项目中实际应用

    java使用elasticsearch进行模糊查询 使用环境上篇文章本人已书写过,需要maven坐标,ES连接工具类的请看上一篇文章,以下是内容是笔者在真实项目中运用总结而产生,并写的是主要方法和思路 ...

  2. MySQL 在各种程序语音的连接字符串(转)

    一.MySQL Connector/ODBC 2.50 (MyODBC 2.50)连接方式 1.本地数据库连接Driver={MySQL};Server=localhost;Option=16834; ...

  3. PyQt5--QFontDiaglog

    # -*- coding:utf-8 -*- ''' Created on Sep 17, 2018 @author: SaShuangYiBing Comment: ''' import sys f ...

  4. 《深入理解JVM》读书笔记

    目前只是整理了书的前几章,把jvm的内存划分简要说明.垃圾回收算法.垃圾回收器.常用的命令和工具进行说明.命令和工具的使用找个时间需要详细按步骤截图说明. 还有一部分内容是举例说明了一下字节码指令的样 ...

  5. Nowcoder 提高组练习赛-R1

    https://www.nowcoder.com/acm/contest/172#question 单人报名300元,五人合报免费,于是就和学弟同学学长们组了一个三世同堂的队伍,高一的学长wzhqwq ...

  6. datagridview 获取选中行的索引

    C# CODE for (int i = 0; i < this.dataGridView1.SelectedRows.Count; i++)//遍历所有选中的行 { this.dataGrid ...

  7. OpenCV——模板匹配

    minMaxLoc函数: void minMaxLoc( const Mat& src, double* minVal, double* maxVal=0, Point* minLoc=0, ...

  8. C++ 虚函数的使用

    虚函数是C++中用于实现多态(polymorphism)的机制.核心理念就是通过基类访问派生类定义的函数.假设我们有下面的类层次: #include <iostream> using na ...

  9. $LCT$初步

    \(\rm{0x01}\) 闲话 · \(LCT\)的用途以及具体思路 LCT是啥?百度一下的话--貌似是一种检查妇科病的东西?Oier的口味可是真不一般啊 咳,其实在我最近只是浅浅地学了一部分的基础 ...

  10. TCP和UDP套接字编程 (java实现)

    在了解网络编程之前,我们先了解一下什么叫套接字 套接字即指同一台主机内应用层和运输层之间的接口 由于这个套接字是建立在网络上建立网络应用的可编程接口 因此也将套接字称为应用程序和网络之间的应用程序编程 ...