ArcEngine数据删除几种方法和性能比较

一、几种删除方法代码

1. 查询结果中删除

       /// <summary>
        /// 1. 查询结果中删除
        /// </summary>
        /// <param name="PFeatureclass"></param>
        private void Delete1(IFeatureClass featureclass, string whereClause)
        {
            IQueryFilter pQueryFilter = new QueryFilterClass();
            pQueryFilter.WhereClause = whereClause;
            IFeatureCursor pFeatureCursor = featureclass.Search(pQueryFilter, false);
            IFeature pFeature = pFeatureCursor.NextFeature();
            while (pFeature != null)
            {
                pFeature.Delete();
                pFeature = pFeatureCursor.NextFeature();
            }

            System.Runtime.InteropServices.Marshal.ReleaseComObject(pQueryFilter);
        }

 

2. 更新游标删除

       /// <summary>
        /// 2. 更新游标删除
        /// </summary>
        private void Delete2(IFeatureClass featureclass, string whereClause)
        {

            IQueryFilter pQueryFilter = new QueryFilterClass();
            pQueryFilter.WhereClause = whereClause;
            IFeatureCursor pFeatureCursor = featureclass.Update(pQueryFilter, false);
            IFeature pFeature = pFeatureCursor.NextFeature();
            while (pFeature != null)
            {
                pFeatureCursor.DeleteFeature();
                pFeature = pFeatureCursor.NextFeature();
            }

            System.Runtime.InteropServices.Marshal.ReleaseComObject(pQueryFilter);
        }

 

3. 使用DeleteSearchedRows删除

 /// <summary>
        /// 3. 使用DeleteSearchedRows删除
        /// </summary>
        /// <param name="PFeatureclass"></param>
        private void Delete4(IFeatureClass featureclass, string whereClause)
        {
            IQueryFilter pQueryFilter = new QueryFilterClass();
            pQueryFilter.WhereClause = whereClause;
            ITable pTable = featureclass as ITable;
            pTable.DeleteSearchedRows(pQueryFilter);

            System.Runtime.InteropServices.Marshal.ReleaseComObject(pQueryFilter);
        }

 

4. 使用Workspace.ExecuteSQL删除

     /// <summary>
        /// 4. ExecuteSQL删除
        /// </summary>
        /// <param name="PFeatureclass"></param>
        private void Delete4(IFeatureClass featureclass, string whereClause)
        {
            IDataset pDataset = featureclass as IDataset;
            pDataset.Workspace.ExecuteSQL("delete from " + featureclass.AliasName + " where " + whereClause);
        }

 

二、测试性能和比较

//1、相同的数据条件,删除2000条记录
//2、测试代码
//IFeatureLayer pFeatureLayer = axMapControl1.Map.get_Layer(0) as IFeatureLayer;
//IFeatureClass pFeatureClass = pFeatureLayer.FeatureClass;
//System.Diagnostics.Stopwatch stopwatch = new System.Diagnostics.Stopwatch();
//MyWatch.Start();

//Delete1(pFeatureClass,"objectID<=2000")
//Delete2(pFeatureClass,"objectID<=2000");
//Delete3(pFeatureClass,"objectID<=2000");
//Delete4(pFeatureClass,"objectID<=2000");

//stopwatch.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),加上进度条,这样界面很友好

参考资料:

 

posted @ 2019-08-21 10:12  ParanoiaApe  阅读(289)  评论(0)    收藏  举报