C#+arcengine开发中ITable与DataTable的转换问题,ITable与DataTable相互转换的代码


最近学习到ITable与DataTable是不能够强制转换的,ITable类型的表在代码中无法转换成DataTable类型,代码会提示错误“无法强制转换”;DataTable类型在代码中可以转换成ITable不会报错,但是表为空null。

后来看到了这一篇博客,才知道相互转换的方法,果断转了。值得学习!

转自:https://blog.csdn.net/Prince999999/article/details/79813043

        /// <summary>  
        /// 打开dbf表  
        /// </summary>  
        /// <param name="pathName"></param>  
        /// <param name="tableName"></param>  
        /// <returns></returns>  
        public static ITable OpenTable(string pathName, string tableName)  
        {  
            // Create the workspace name object.  
            IWorkspaceName workspaceName = new WorkspaceNameClass();  
            workspaceName.PathName = pathName;  
            workspaceName.WorkspaceFactoryProgID = "esriDataSourcesFile.shapefileworkspacefactory";  
            // Create the table name object.  
            IDatasetName dataSetName = new TableNameClass();  
            dataSetName.Name = tableName;  
            dataSetName.WorkspaceName = workspaceName;  
            // Open the table.  
            IName name = (IName)dataSetName;  
            ITable table = (ITable)name.Open();  
            return table;  
        }  
  
        /// <summary>  
        /// 将ITable转换为DataTable  
        /// </summary>  
        /// <param name="mTable"></param>  
        /// <returns></returns>  
        public static DataTable ToDataTable(ITable mTable)  
        {  
            try  
            {  
                DataTable pTable = new DataTable();  
                for (int i = 0; i < mTable.Fields.FieldCount; i++)  
                {  
                    pTable.Columns.Add(mTable.Fields.get_Field(i).Name);  
                }  
  
                ICursor pCursor = mTable.Search(null, false);  
                IRow pRrow = pCursor.NextRow();  
                while (pRrow != null)  
                {  
                    DataRow pRow = pTable.NewRow();  
                    string[] StrRow = new string[pRrow.Fields.FieldCount];  
                    for (int i = 0; i < pRrow.Fields.FieldCount; i++)  
                    {  
                        StrRow[i] = pRrow.get_Value(i).ToString();  
                    }  
                    pRow.ItemArray = StrRow;  
                    pTable.Rows.Add(pRow);  
                    pRrow = pCursor.NextRow();  
                }  
  
                return pTable;  
            }  
            catch (Exception ex)  
            {  
                return null;  
            }  
        }  
  
        /// <summary>  
        /// 把DataTable转为ITable ,tempPath 不含文件名的问价夹路径  
        /// </summary>  
        /// <param name="mTable"></param>  
        /// <returns></returns>  
        public static  ITable  ToITable(DataTable  mTable,string tempPath)  
        {  
            try  
            {  
                #region 新建表字段  
  
                IField pField = null;  
  
                IFields fields = new FieldsClass();  
                IFieldsEdit fieldsEdit = (IFieldsEdit)fields;  
                fieldsEdit.FieldCount_2 = 3;  
  
                pField = new FieldClass();  
                IFieldEdit fieldEdit = (IFieldEdit)pField;  
                fieldEdit.Name_2 = "FromField";  
                fieldEdit.AliasName_2 = "开始字段值";  
                fieldEdit.Type_2 = esriFieldType.esriFieldTypeDouble;  
                fieldEdit.Editable_2 = true;  
  
                //添加开始字段  
                fieldsEdit.set_Field(0, pField);  
  
                IField pField1 = new FieldClass();  
                IFieldEdit fieldEdit1 = (IFieldEdit)pField1;  
                fieldEdit1.Name_2 = "ToField";  
                fieldEdit1.AliasName_2 = "结束字段值";  
                fieldEdit1.Type_2 = esriFieldType.esriFieldTypeDouble;  
                fieldEdit1.Editable_2 = true;  
  
                //添加结束字段  
                fieldsEdit.set_Field(1, pField1);  
  
                IField pField2 = new FieldClass();  
                IFieldEdit fieldEdit2 = (IFieldEdit)pField2;  
                fieldEdit2.Name_2 = "outField";  
                fieldEdit2.AliasName_2 = "分类字段值";  
                fieldEdit2.Type_2 = esriFieldType.esriFieldTypeDouble;  
                fieldEdit2.Editable_2 = true;  
                //添加重分类字段  
                fieldsEdit.set_Field(2, pField2);  
 
                #endregion  
  
                ShapefileWorkspaceFactoryClass class2 = new ShapefileWorkspaceFactoryClass();  
                ESRI.ArcGIS.Geodatabase.IWorkspace pWorkspace = class2.OpenFromFile(tempPath, 0);  
                IFeatureWorkspace pFWS = pWorkspace as IFeatureWorkspace;  
  
                //删除已有的  
                if (System.IO.File.Exists(tempPath + "重分类.dbf"))  
                {  
                    System.IO.File.Delete(tempPath + "重分类.dbf");  
                }  
  
                //创建空表  
                ESRI.ArcGIS.Geodatabase.ITable pTable;  
                pTable = pFWS.CreateTable("重分类", fieldsEdit, null, null, "");  
                  
                //获取表中记录数  
                int count=mTable .Rows .Count ;  
  
                //转换为ITable中的数据  
                for(int k=0;k<count ;k++)  
                {  
                    //ITable 的记录  
                    IRow row = pTable.CreateRow();  
  
                    
                   DataRow pRrow=mTable .Rows[k];  
                   //列元素  
                   int rowNum= pRrow .ItemArray.Length;  
                    
                    // 添加记录  
                    for (int n=1;n<rowNum+1 ;n++)  
                    {  
                        row.set_Value(n,pRrow.ItemArray.GetValue(n-1));  
                        row.Store ();  
                    }  
                }  
                return pTable ;  
            }  
            catch (Exception ex)  
            {  
                return null;  
            }  
        }  
  
        /// <summary>  
        ///保存DataTable表位DBF ,tempPath 文件完整路径  
        /// </summary>  
        /// <param name="mTable"></param>  
        /// <returns></returns>  
        public static bool  SaveTable(DataTable mTable, string tempPath)  
        {  
            try  
            {  
                #region 新建表字段  
  
                IField pField = null;  
  
                IFields fields = new FieldsClass();  
                IFieldsEdit fieldsEdit = (IFieldsEdit)fields;  
                fieldsEdit.FieldCount_2 = 3;  
  
                pField = new FieldClass();  
                IFieldEdit fieldEdit = (IFieldEdit)pField;  
                fieldEdit.Name_2 = "FromField";  
                fieldEdit.AliasName_2 = "开始字段值";  
                fieldEdit.Type_2 = esriFieldType.esriFieldTypeDouble;  
                fieldEdit.Editable_2 = true;  
  
                //添加开始字段  
                fieldsEdit.set_Field(0, pField);  
  
                IField pField1 = new FieldClass();  
                IFieldEdit fieldEdit1 = (IFieldEdit)pField1;  
                fieldEdit1.Name_2 = "ToField";  
                fieldEdit1.AliasName_2 = "结束字段值";  
                fieldEdit1.Type_2 = esriFieldType.esriFieldTypeDouble;  
                fieldEdit1.Editable_2 = true;  
  
                //添加结束字段  
                fieldsEdit.set_Field(1, pField1);  
  
                IField pField2 = new FieldClass();  
                IFieldEdit fieldEdit2 = (IFieldEdit)pField2;  
                fieldEdit2.Name_2 = "outField";  
                fieldEdit2.AliasName_2 = "分类字段值";  
                fieldEdit2.Type_2 = esriFieldType.esriFieldTypeDouble;  
                fieldEdit2.Editable_2 = true;  
                //添加重分类字段  
                fieldsEdit.set_Field(2, pField2);  
 
                #endregion  
  
                string path = System.IO.Path.GetDirectoryName(tempPath);  
                string fileName = System.IO.Path.GetFileName(tempPath);  
  
                ShapefileWorkspaceFactoryClass class2 = new ShapefileWorkspaceFactoryClass();  
                ESRI.ArcGIS.Geodatabase.IWorkspace pWorkspace = class2.OpenFromFile(path, 0);  
                IFeatureWorkspace pFWS = pWorkspace as IFeatureWorkspace;  
  
                //删除已有的  
                if (System.IO.File.Exists(tempPath))  
                {  
                    System.IO.File.Delete(tempPath);  
                }  
  
                fileName = fileName.Split('.')[0];  
                //创建空表  
                ESRI.ArcGIS.Geodatabase.ITable pTable;  
                pTable = pFWS.CreateTable(fileName, fieldsEdit, null, null, "");  
  
                //获取表中记录数  
                int count = mTable.Rows.Count;  
  
                //转换为ITable中的数据  
                for (int k = 0; k < count; k++)  
                {  
                    //ITable 的记录  
                    IRow row = pTable.CreateRow();  
  
  
                    DataRow pRrow = mTable.Rows[k];  
                    //列元素  
                    int rowNum = pRrow.ItemArray.Length;  
  
                    // 添加记录  
                    for (int n = 1; n < rowNum + 1; n++)  
                    {  
                        row.set_Value(n, pRrow.ItemArray.GetValue(n - 1));  
                        row.Store();  
                    }  
                }  
  
                return true ;  
            }  
            catch (Exception ex)  
            {  
                return false ;  
            }  
        }  

阅读更多

扫码向博主提问

acoolgiser

非学,无以致疑;非问,无以广识
  • 擅长领域:
  • C#
  • ArcEngine
  • MFC
去开通我的Chat快问
文章标签: C# arcengine
个人分类: ArcEngine二次开发
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页

关闭
关闭
关闭