将FeatClass属性表高效率转换成DataTable

把IFeatureClass ITable转换成DataTable,效率高。

方法一 ITable遍历行 

1.用IFeatureClass属性查询的方式较慢,这样速度可提高几十倍。

2.避免了hresult 0x80040952错误

        /// <summary>
        /// 将FeatClass属性表高效率转换成DataTable  
///gisrsman.cnblogs.com
/// </summary> /// <param name="featCls">输入的要素类</param> /// <param name="pQueryFilter">查询器,无则为Null</param> /// <returns></returns> public static DataTable FeatClass2DataTable(IFeatureClass featCls, IQueryFilter pQueryFilter) { DataTable pAttDT = null; string pFieldName; string pFieldValue; DataRow pDataRow; if (featCls != null) { //根据IFeatureClass字段结构初始化一个表结构 pAttDT = InitTableByFeaCls(featCls); ITable pFeatTable = featCls as ITable; int pFieldCout = pFeatTable.Fields.FieldCount; ICursor pCursor = pFeatTable.Search(pQueryFilter, false); IRow pRow = pCursor.NextRow(); while (pRow != null) { pDataRow = pAttDT.NewRow(); for (int j = 0; j < pFieldCout; j++) { pFieldValue = pRow.get_Value(j).ToString(); pFieldName = pFeatTable.Fields.get_Field(j).Name; pDataRow[pFieldName] = pFieldValue; } pAttDT.Rows.Add(pDataRow); pRow = pCursor.NextRow(); } } return pAttDT; }

注意: 不要使用pTable.GetRow(i).get_Value(j)这种方式,容易出hresult 0x80040952错误

方法二 IFeatureClass遍历属性

遍历要素法查询,效率低

遍历要素方法
        /// <summary>
        /// 将FeatClass属性表转换成DataTable
        /// </summary>
        /// <param name="featCls"></param>
        /// <param name="pQueryFilter">查询器,无则为Null</param>
        /// <returns></returns>
        public static DataTable FeatClass2DataTable(IFeatureClass featCls, IQueryFilter pQueryFilter)
        {
            DataTable pAttDT = null;
            IFeature pFeature = null;
            IFeatureCursor pFeatCur = null;
            string pFieldName;
            string pFieldValue;
            DataRow pDataRow;

            if (featCls != null)
            {
                pAttDT = InitTableByFeaCls(featCls);
                pFeatCur = featCls.Search(pQueryFilter, false);
                if (pFeatCur != null) pFeature = pFeatCur.NextFeature();

                while (pFeature != null)
                {
                    pDataRow = pAttDT.NewRow();

                    IFields pFields = pFeature.Fields;
                    int pNum = pFields.FieldCount;
                    for (int i = 0; i < pNum; i++)
                    {
                        pFieldName = pFields.get_Field(i).Name;
                        pFieldValue = pFeature.get_Value(i).ToString();
                        pDataRow[pFieldName] = pFieldValue;
                    }
                    pAttDT.Rows.Add(pDataRow);

                    pFeature = pFeatCur.NextFeature();
                }
            }
            return pAttDT;
        }

方法三 :直接用sde用户连接,查询对应表

每个要素类在数据库中本质上一张表,可以直接用sql语句查询对应要素类的表。

例如下图是铁路要素类在oracle中的存储。

hresult 0x80040952错误

objectID不一定是按顺序排列,所以读取数据不要用for循环,用while。
1.在遍历featureClass时:Cursor.nextFeature()
主要原因是使用for循环遍历要素集,但是for循环依据objectID作为ID遍历,而不少要素集的objectID都不是依次从0-n这么规范连续下去的,例如0 1 2 5 6 7 8 ... ...
还是使用Cursor.nextFeature(),这样就不会出现上述的问题了

2.在遍历Itable行时:pCursor.NextRow();


参考:
ArcGIS Engine效率探究——要素的添加和删除、属性的读取和更新
Arcengine效率探究之一——属性的读取
Arcengine效率探究之二——属性的更新
原文地址:https://www.cnblogs.com/GISRSMAN/p/5063219.html