方园几里 2021-03-13 20:09 采纳率: 0%
浏览 68

C# AE在aspx页面里读取shp文件的属性表(在gdv里动态显示)添加字段再次读取属性表报错。

报错:对 COM 组件的调用返回了错误 HRESULT E_FAIL。

添加字段事件代码:

protected void BtnNewFild_Click(object sender, EventArgs e)
        {
            if (TxbFild.Text != "")
            {   IFeatureClass pFeatureClass = GetFeatureClass(@"F:\贵州省石漠化数据服务平台\区县石漠化数据2005to2015\区县石漠化数据2005to2015.shp");
                //获取shp文件里的字段集合
                IFields pFields = pFeatureClass.Fields;
                int fieldsCount = pFields.FieldCount;
                int m = 0;
                for (int i = 0; i < fieldsCount; i++)
                {
                    if (TxbFild.Text != (pFields.get_Field(i).Name ))
                    {
                          m += 1;
                     }
                     else
                     {
                          Response.Write("<script>alert('输入的字段名已存在')</script>");
                      }
                 }
                if (m == fieldsCount)
                {
                    //在新增字段之前,先修改SchemaLock的状态
                    ISchemaLock pSchemaLock = pFeatureClass as ISchemaLock;
                    pSchemaLock.ChangeSchemaLock(esriSchemaLock.esriExclusiveSchemaLock);//set and exclusive lock on the class 设置并独占锁
                    //首先一定要获取Featureclass,利用Featureclass获取IWorkspace和IWorkspaceEdit:
                    //获取要素类
                    IWorkspace pWorkspace = ((IDataset)pFeatureClass).Workspace;
                    //pWorkspaceFactory.OpenFromFile(System.IO.Path.GetDirectoryName(@"F:\贵州省石漠化数据服务平台\区县石漠化数据2005to2015\区县石漠化数据2005to2015.shp"), 0);//System.IO.Path.GetDirectoryName(filePath)作用是获取shp文件所在的文件夹目录 
                    IWorkspaceEdit workspaceEdit = pWorkspace as IWorkspaceEdit;
                    //然后开启编辑状态:
                    bool startEdit = workspaceEdit.IsBeingEdited();
                          if (!startEdit)
                          {
                                workspaceEdit.StartEditing(false);
                           }
                     workspaceEdit.StartEditOperation();        
                     //字段编辑
                     IFieldsEdit pFieldsEdit = pFields as IFieldsEdit;
                     //定义单个字段
                     IField pField = new FieldClass();
                     IFieldEdit pFieldEdit = pField as IFieldEdit;
                     pFieldEdit.Name_2 = TxbFild.Text;
                     pFieldEdit.Type_2 = esriFieldType.esriFieldTypeString;
                     IClass pClass = pFeatureClass as IClass;        //use ITable or IClass   
                     pClass.AddField(pField);
                     pSchemaLock.ChangeSchemaLock(esriSchemaLock.esriExclusiveSchemaLock);
                     //停止编辑
                     workspaceEdit.StopEditOperation();
                      startEdit = workspaceEdit.IsBeingEdited();
                      if (!startEdit)
                      {
                         workspaceEdit.StopEditing(true);
                       }
                      
                      //释放对象
                      System.Runtime.InteropServices.Marshal.ReleaseComObject(pWorkspace);
                      System.Runtime.InteropServices.Marshal.ReleaseComObject(workspaceEdit);
                      System.Runtime.InteropServices.Marshal.ReleaseComObject(pFields);
                      System.Runtime.InteropServices.Marshal.ReleaseComObject(pFieldsEdit);
                      System.Runtime.InteropServices.Marshal.ReleaseComObject(pField);
                      System.Runtime.InteropServices.Marshal.ReleaseComObject(pFieldEdit);
                      System.Runtime.InteropServices.Marshal.ReleaseComObject(pClass);
                      BindData();
                }
                System.Runtime.InteropServices.Marshal.ReleaseComObject(pFeatureClass);
            }
            else
               
            {  Response.Write("<script>alert('请输入字段名')</script>");
                TxbFild.Visible = true;
            }
          
        }


 

 /// <summary>
        /// 获取要素属性表
        /// </summary>
        /// <param name="pFeatureClass"></param>
        /// <returns></returns>
        private static DataTable GetAttributesTable(IFeatureClass pFeatureClass)
        {

            string geometryType = string.Empty;
            if (pFeatureClass.ShapeType == esriGeometryType.esriGeometryPoint)
            {
                geometryType = "点";
            }
            if (pFeatureClass.ShapeType == esriGeometryType.esriGeometryMultipoint)
            {
                geometryType = "点集";
            }
            if (pFeatureClass.ShapeType == esriGeometryType.esriGeometryPolyline)
            {
                geometryType = "折线";
            }
            if (pFeatureClass.ShapeType == esriGeometryType.esriGeometryPolygon)
            {
                geometryType = "面";
            }

            // 字段集合
            IFields pFields = pFeatureClass.Fields;
            int fieldsCount = pFields.FieldCount;

            // 写入字段名
            DataTable dataTable = new DataTable();
            for (int i = 0; i < fieldsCount; i++)
            {
                dataTable.Columns.Add(pFields.get_Field(i).Name);
            }

            // 要素游标
            IFeatureCursor pFeatureCursor = pFeatureClass.Search(null, false);
            IFeature pFeature = pFeatureCursor.NextFeature();
            if (pFeature == null)
            {
                return dataTable;
            }
            else
            {
                // 获取MZ值
                IMAware pMAware = pFeature.Shape as IMAware;
                IZAware pZAware = pFeature.Shape as IZAware;
                if (pMAware.MAware)
                {
                    geometryType += " M";
                }
                if (pZAware.ZAware)
                {
                    geometryType += "Z";
                }

                // 写入字段值
                while (pFeature != null)
                {
                    DataRow dataRow = dataTable.NewRow();
                    for (int i = 0; i < fieldsCount; i++)
                    {
                        if (pFields.get_Field(i).Type == esriFieldType.esriFieldTypeGeometry)
                        {
                            dataRow[i] = geometryType;
                        }
                        else
                        {
                            dataRow[i] = pFeature.get_Value(i).ToString();
                        }
                    }
                    dataTable.Rows.Add(dataRow);
                    ComReleaser.ReleaseCOMObject(pFeature);
                    System.Runtime.InteropServices.Marshal.ReleaseComObject(pFeature);
                    pFeature = pFeatureCursor.NextFeature();
                     
                  }

                ComReleaser.ReleaseCOMObject(pFeatureCursor); // 释放游标
                System.Runtime.InteropServices.Marshal.ReleaseComObject(pFeatureCursor);
                System.Runtime.InteropServices.Marshal.ReleaseComObject(pFeatureClass);
                return dataTable;
               
             }  
                 
          }

/// <summary>
        /// 绑定数据到gridview控件
        /// </summary>
        private void BindData()
        {
            IFeatureClass pFeatureClass = GetFeatureClass(@"F:\贵州省石漠化数据服务平台\区县石漠化数据2005to2015\区县石漠化数据2005to2015.shp");
            DataTable     dataTable = GetAttributesTable(pFeatureClass);
            dgvAttributesTable.DataSource = dataTable;
            dgvAttributesTable.DataBind();
            System.Runtime.InteropServices.Marshal.ReleaseComObject(pFeatureClass);
            dgvAttributesTable.Attributes.Add("onclick", "GetData(event)");
        }

/// <summary>
        /// 获取要素类
        /// </summary>
        /// <param name="filePath"></param>
        /// <returns></returns>
        private static IFeatureClass GetFeatureClass(string filePath)
        {
            AElicense();
            IWorkspaceFactory pWorkspaceFactory = new ShapefileWorkspaceFactory();
            IWorkspaceFactoryLockControl pWorkspaceFactoryLockControl = pWorkspaceFactory as IWorkspaceFactoryLockControl;
            if (pWorkspaceFactoryLockControl.SchemaLockingEnabled)//解锁shp文件
            {
                pWorkspaceFactoryLockControl.DisableSchemaLocking();
            }
            IWorkspace pWorkspace = pWorkspaceFactory.OpenFromFile(System.IO.Path.GetDirectoryName(filePath), 0);//System.IO.Path.GetDirectoryName(filePath)作用是获取shp文件所在的文件夹目录
            IFeatureWorkspace pFeatureWorkspace = pWorkspace as IFeatureWorkspace;
            IFeatureClass pFeatureClass = pFeatureWorkspace.OpenFeatureClass(System.IO.Path.GetFileName(filePath));
            //System.Runtime.InteropServices.Marshal.ReleaseComObject(pWorkspaceFactory);
            //System.Runtime.InteropServices.Marshal.ReleaseComObject(pWorkspace);
            //System.Runtime.InteropServices.Marshal.ReleaseComObject(pFeatureWorkspace);
            return pFeatureClass;
           
            
        }

  • 写回答

1条回答 默认 最新

  • 你知我知皆知 2024-07-24 02:41
    关注

    以下回答参考 皆我百晓生券券喵儿 等免费微信小程序相关内容作答,并由本人整理回复。

    从您提供的代码来看,似乎遇到了一个与COM组件交互有关的问题。HResult E_FAIL 是一个常见的错误消息,表示在尝试使用 COM 组件时发生了一个未处理的异常或错误。

    根据您的描述,问题可能出在以下几点:

    1. 字段名称冲突:您在尝试向属性表中添加新的字段时,发现字段名已经存在于其他字段中。解决方法是检查字段名称,确保没有与其他字段重名,并且在添加新字段前清除所有重复的字段名。

    2. COM组件错误:由于 E_FAIL 错误,可能是由于 COM 组件的实现存在问题或者版本不兼容导致的。建议检查 GetFeatureClass 方法中的代码,看是否正确实现了 esriDataset 类型的接口,并且在创建 IFeatureClass 对象时设置了正确的属性。此外,检查是否有其他可能导致 COM 异常的错误信息。

    3. 数据库连接问题:如果您正在使用数据库来存储这些数据,请检查数据库连接设置是否正确。如果数据库服务器无法访问,这可能会导致 E_FAIL 错误。

    4. 性能问题:检查是否有任何性能瓶颈,例如数据库查询速度慢、网络延迟等问题。这可能会导致 COM 组件无法正常工作。

    为了更精确地解决问题,我建议查看错误日志以了解具体的错误信息。另外,您可以考虑将代码分解为更小的部分进行测试,以便更容易定位问题所在。同时,查阅文档以确保您使用的 COM 组件的最新版本。

    评论

报告相同问题?

悬赏问题

  • ¥30 远程帮我安装软件及库文件
  • ¥15 关于#自动化#的问题:如何通过电脑控制多相机同步拍照或摄影(相机或者摄影模组数量大于60),并将所有采集的照片或视频以一定编码规则存放至规定电脑文件夹内
  • ¥20 深信服vpn-2050这台设备如何配置才能成功联网?
  • ¥15 Arduino的wifi连接,如何关闭低功耗模式?
  • ¥15 Android studio 无法定位adb是什么问题?
  • ¥15 angular项目错误
  • ¥20 需要帮我远程操控一下,运行一下我的那个代码,我觉得我无能为力了
  • ¥20 有偿:在ubuntu上安装arduino以及其常用库文件。
  • ¥15 请问用arcgis处理一些数据和图形,通常里面有一个根据点划泰森多边形的命令,直接划的弊端是只能执行一个完整的边界,但是我们有时候会用到需要在有很多边界内利用点来执行划泰森多边形的命令
  • ¥30 在wave2foam中执行setWaveField时遇到了如下的浮点异常问题,请问该如何解决呢?