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
            } 
        } 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值