将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效率探究之二——属性的更新
时间: 2024-10-26 19:06:38

将FeatClass属性表高效率转换成DataTable的相关文章

将list&lt;对象&gt;转换成DataTable,把DataTable转换成参数传入存储过程实现批量插入数据

领导让在存储过程中批量添加数据,找出效率最高的,我看到后台代码后,发现可以将list<对象>转换成DataTable,把DataTable转换成参数传入存储过程实现批量插入数据,知道还有其他的方法,不过这个方法已经实现,就写一下了: 1.创建表. CREATE TABLE [dbo].[person]( [ID] [int] IDENTITY(1,1) NOT NULL, [Name] [nvarchar](50) NULL, [Pwd] [nvarchar](50) NULL, [Age]

带复杂表头合并单元格的HtmlTable转换成DataTable并导出Excel(转)

步骤: 一.前台JS取HtmlTable数据,根据设定的分隔符把数据拼接起来 <!--导出Excel--> <script type="text/javascript"> //导出Excel function exportExcel() { var data = ""; $("#divRptTable").find("table").find("tr").each(function

List转DataTable(反射) ; 将泛型集合类转换成DataTable ; 将集合类转换成DataTable

#region 将集合类转换成DataTable /// <summary> /// 将集合类转换成DataTable /// </summary> /// <param name="list">集合</param> /// <returns></returns> public static DataTable ToDataTable(IList list) { DataTable result = new Dat

list 转换成datatable

感谢网上的一位朋友 1 /// <summary> 2 60 /// 将集合类转换成DataTable 3 61 /// </summary> 4 62 /// <param name="list">集合</param> 5 63 /// <returns></returns> 6 64 public static DataTable ToDataTable(IList list) 7 65 { 8 66 Data

C# DataTable转换成实体列表 与 实体列表转换成DataTable

/// <summary> /// DataTable转换成实体列表 /// </summary> /// <typeparam name="T">实体 T </typeparam> /// <param name="table">datatable</param> /// <returns></returns> public static IList<T>

.net excel 转换成datatable,创建文件夹

protected void Button9_Click(object sender, EventArgs e) { string path = ""; path = FileUpload3.PostedFile.FileName; if (path == "") { string jss = "<script language='javascript' type='text/javascript'> alert('先选择文件')</sc

.Net常用技巧_将DataGridView的内容转换成DataTable

using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Text; using System.Windows.Forms; using System.Data.SqlClient; using Utility; namespace MyTool { public class GetDgvToT

将泛类型集合List类转换成DataTable

/// <summary> /// 将泛类型集合List类转换成DataTable /// </summary> /// <param name="list">泛类型集合</param> /// <returns></returns> public static DataTable ListToDataTable<T>(List<T> entitys) { //检查实体集合不能为空 if (

讲List转换成DataTable

/// <summary> /// 讲list集合转换成datatable /// </summary> /// <param name="list"></param> /// <returns></returns> public static System.Data.DataTable ListToDataTable(IList list) { System.Data.DataTable result = new