免费视频|新人指南|投诉删帖|广告合作|地信网APP下载

查看: 4721|回复: 4
收起左侧

ArcEngine,C#数据删除几种方法以及性能比较

[复制链接]

2072

主题

100000万

铜板

363

好友

地信专家组

每一次的分离都是为了下一次的相聚

Rank: 14Rank: 14Rank: 14Rank: 14

积分
17622

精华勋章宣传勋章爱心勋章组织勋章地信元老灌水勋章荣誉会员勋章活跃勋章贡献勋章

发表于 2009-12-3 21:37 | 显示全部楼层 |阅读模式
一、  几种删除方法代码
1.  查询结果中删除
  private void Delete1(IFeatureClass PFeatureclass)
        {
            IQueryFilter pQueryFilter = new QueryFilterClass();
            pQueryFilter.WhereClause = "objectID<=" + DeleteNum;
            IFeatureCursor pFeatureCursor = PFeatureclass.Search(pQueryFilter, false);            IFeature pFeature = pFeatureCursor.NextFeature();
            while (pFeature != null)
            {
                pFeature.Delete();
                pFeature = pFeatureCursor.NextFeature();
            }
            System.Runtime.InteropServices.Marshal.ReleaseComObject(pQueryFilter);
        }
2.  更新游标删除
private void Delete2(IFeatureClass PFeatureclass)
        {
            IQueryFilter pQueryFilter = new QueryFilterClass();
            pQueryFilter.WhereClause = "objectID<=" + DeleteNum;
            IFeatureCursor pFeatureCursor = PFeatureclass.Update(pQueryFilter, false);
            IFeature pFeature = pFeatureCursor.NextFeature();
            while (pFeature != null)
            {
                pFeatureCursor.DeleteFeature();
                pFeature = pFeatureCursor.NextFeature();
            }
            System.Runtime.InteropServices.Marshal.ReleaseComObject(pQueryFilter);
  
        }
3.  使用DeleteSearchedRows删除
private void Delete4(IFeatureClass PFeatureclass)
        {
            IQueryFilter pQueryFilter = new QueryFilterClass();
            pQueryFilter.WhereClause = "objectID<=" + DeleteNum;
            ITable pTable = PFeatureclass as ITable;
            pTable.DeleteSearchedRows(pQueryFilter);
            System.Runtime.InteropServices.Marshal.ReleaseComObject(pQueryFilter);
        }
  
4.  ExecuteSQL删除
private void Delete4(IFeatureClass PFeatureclass)
        {
            IDataset pDataset = PFeatureclass as IDataset;
            pDataset.Workspace.ExecuteSQL("delete from " + PFeatureclass.AliasName + " where objectid<=" + DeleteNum);
        }
二、  测试性能和比较
1、       相同的数据条件,删除2000条记录
2、       测试代码
IFeatureLayer pFeatureLayer = axMapControl1.Map.get_Layer(0) as IFeatureLayer;
            IFeatureClass PFeatureClass = pFeatureLayer.FeatureClass;
            System.Diagnostics.Stopwatch MyWatch = new System.Diagnostics.Stopwatch();
            MyWatch.Start();
            Delete1(PFeatureClass)
            //Delete2(PFeatureClass);
            //Delete3(PFeatureClass);
            //Delete4(PFeatureClass);
            //Delete5(PFeatureClass);
            MyWatch.Stop();
            MessageBox.Show("删除时间:" + MyWatch.ElapsedMilliseconds.ToString() + "毫秒");
3、       测试情况
测试方法
第一次时间(单位ms)
第一次时间(单位ms)
  
1
5214ms
5735ms
  
2
299ms
290Ms
  
3
59ms
28ms
  
4
26ms
26ms
  
三、  结论
1、         使用ExecuteSQL删除最快,数据库的效率最高。
2、         DeleteSearchedRows和ExecuteSQL属于批量删除,性能较优。
3、         查询结果中删除,速度最慢,如果你使用这种方法,建立你马上修改你的程序,因为你在浪费时间。
4、       小数据量记录数小于500000条,请使用DeleteSearchedRows或ExecuteSQL,否则使用更新游标删除(方法2),加上进度条,这样界面很友好。
转载保留版权://by yl landgis@126.com 2008.7.8

2

主题

39

铜板

0

好友

技术员

Rank: 3Rank: 3

积分
84
发表于 2010-5-11 23:24 | 显示全部楼层
为什么我进行删除时出现“The application is not licensed to perform this operation [Polygons]”?

0

主题

62

铜板

0

好友

助理工程师

Rank: 5Rank: 5

积分
162
发表于 2010-5-31 12:19 | 显示全部楼层
是不是axLicenseControl属性中没有勾选arcInfo之类的,或者arcgis服务没有打开

38

主题

2958

铜板

226

好友

地信院士

Rank: 15Rank: 15Rank: 15Rank: 15Rank: 15

积分
2411

宣传勋章

QQ
发表于 2014-12-18 22:12 | 显示全部楼层
学习学习!!!!!!1
回复

使用道具 举报

37

主题

2万

铜板

111

好友

钻石会员

Rank: 26Rank: 26Rank: 26Rank: 26Rank: 26Rank: 26Rank: 26

积分
5763
发表于 2022-3-20 15:18 | 显示全部楼层
进来看看,学习学习
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

在线客服
快速回复 返回顶部 返回列表