zoukankan      html  css  js  c++  java
  • 创建FeatureClass方法、创建要素类出错、FeatureWorkspace.CreateFeatureClass

    转载地址:http://blog.csdn.net/loveyou388i/article/details/53519718

    原标题: .CreateFeatureClass报错原因解析

    声明:本博客仅对博主一人负责,不保证其正确性级准确性,仅供参考,欢迎指正。 
    1.Microsoft Jet 数据库引擎找不到输入表或查询 ‘GDB_DataChanges’。 确定它是否存在,以及它的名称的拼写是否正确。 
    我发现在百度上是找不到关于这个几个关键字的信息的,因此本菜鸟翻越长城,找到了解决办法,详细见下。我没有仔细看下面说明,因为英文实在是憋足。但我估计是9.3和10.0的AE开发版本不同,应该是老版本需要使用IWorkspaceEdit的StarEditing()方法和StopEditing()方法。 
    主要解决办法就是通过IWorkspaceEdit的StarEditing()方法和StopEditing()方法,在两个方法运行中间进行CreateFeatureClass。 
    原地址:http://gis.stackexchange.com/questions/103949/create-featureclass-in-personal-geodatabase-and-store-data 
    原因说明:https://geonet.esri.com/thread/45118

    下面是个从无空间定义的mdb数据转换成有空间数据的FeatureClass的例子,错误字段在IEnumFieldsError 类中保存,遍历可以获取错误信息。

          private IFeatureClass CreateFeatureClass(IFeatureWorkspace pfws)
            {
                if (pDemoFeatureClass == null) return null;
                List<NewFieldClass> lFields = pDemoFeatureClass.Fields;
                IFeatureWorkspace pFeatureWorkspace = pfws;
                IFields pFields = new FieldsClass();
                IFieldsEdit pFieldsEdit = pFields as IFieldsEdit;
                IFieldEdit pFieldEdit = new FieldClass();
                #region esriFieldType
                foreach (NewFieldClass nField in lFields)
                {
                    pFieldEdit = new FieldClass();
                    if (nField.FieldType == 0||nField.FieldType == 4) 
                        continue;
                    pFieldEdit.Name_2 = nField.Name;
                    pFieldEdit.AliasName_2 = nField.AliasName;
                    switch (nField.FieldType)
                    {
                        case 0: break;
                        case 1: pFieldEdit.Type_2 = esriFieldType.esriFieldTypeString; break;
                        case 2: pFieldEdit.Type_2 = esriFieldType.esriFieldTypeDouble; break;
                        case 3: pFieldEdit.Type_2 = esriFieldType.esriFieldTypeInteger; break;
                        case 4: pFieldEdit.Type_2 = esriFieldType.esriFieldTypeGeometry; break;
                        default: break;
                    }
                    switch (nField.IsNullable)
                    {
                        case 0: pFieldEdit.IsNullable_2 = false; break;
                        case 1: pFieldEdit.IsNullable_2 = true; break;
                        default: pFieldEdit.IsNullable_2 = true; break;
                    }
                    //switch (nField.Check)
                    //{
                    //    case 0: break;
                    //    case 1: break;
                    //    default: break;
                    //}
    
                    pFieldEdit.Length_2 = nField.FieldLength;
                    pFieldsEdit.AddField(pFieldEdit as IField);
                }
                #endregion
                //设置空间属性字段
                //Domain
                ISpatialReference pSpatialReference = new UnknownCoordinateSystemClass();
                pSpatialReference.SetDomain(-99999999, 99999999, -99999999, 99999999);
                pSpatialReference.SetZDomain(-99999999, 99999999);
                pSpatialReference.SetMDomain(-99999999, 99999999);  
    
                //空间字段设计
                pFieldEdit = new FieldClass();
                pFieldEdit.Name_2 = "SHAPE";
                pFieldEdit.AliasName_2 = "SHAPE";
                IGeometryDef pGDef = new GeometryDefClass();
                IGeometryDefEdit pGDefEdit = pGDef as IGeometryDefEdit;
                string GeoType = pDemoFeatureClass.Name.Substring(pDemoFeatureClass.Name.LastIndexOf("_")).ToUpper();
                if (GeoType.Contains("_L"))
                    pGDefEdit.GeometryType_2 = esriGeometryType.esriGeometryPolyline;
                else if (GeoType.Contains("_P"))
                    pGDefEdit.GeometryType_2 = esriGeometryType.esriGeometryPoint;
    
                pGDefEdit.SpatialReference_2 = pSpatialReference;
                //设置空坐标系↓            
                pFieldEdit.Type_2 = esriFieldType.esriFieldTypeGeometry;
                pFieldEdit.GeometryDef_2 = pGDef;
                pFieldsEdit.AddField(pFieldEdit as IField);
                pFieldEdit.GeometryDef_2 = pGDef;
    
    
                //创建一个Validated Fields集合  
                IFieldChecker fieldChecker = new FieldCheckerClass();
                IEnumFieldError enumFieldError = null;
                IFields validatedFields = null;
                fieldChecker.ValidateWorkspace = (IWorkspace)pfws;
                fieldChecker.Validate(pFields, out enumFieldError, out validatedFields);
                if (enumFieldError != null)
                {
                    IFieldError pError = enumFieldError.Next();
                    while (pError != null)
                    {
                        pError.FieldError.ToString();
                        pError.FieldIndex.ToString();
                        pError = enumFieldError.Next();
                    }
                }
    
                UID pUidClsId = new UIDClass();
                UID pUidClsExt = new UIDClass();
                esriFeatureType pFeatureType = esriFeatureType.esriFTSimple;
                #region pUidClsID字段为空时
                if (pUidClsId == null)
                {
                    pUidClsId = new UIDClass();
                    switch (pFeatureType)
                    {
                        case (esriFeatureType.esriFTSimple):
                            //if (pGeometryType == esriGeometryType.esriGeometryLine)
                            //    pGeometryType = esriGeometryType.esriGeometryPolyline;
                            pUidClsId.Value = "{52353152-891A-11D0-BEC6-00805F7C4268}";
                            break;
                        case (esriFeatureType.esriFTSimpleJunction):
                            //pGeometryType = esriGeometryType.esriGeometryPoint;
                            pUidClsId.Value = "{CEE8D6B8-55FE-11D1-AE55-0000F80372B4}";
                            break;
                        case (esriFeatureType.esriFTComplexJunction):
                            pUidClsId.Value = "{DF9D71F4-DA32-11D1-AEBA-0000F80372B4}";
                            break;
                        case (esriFeatureType.esriFTSimpleEdge):
                            //pGeometryType = esriGeometryType.esriGeometryPolyline;
                            pUidClsId.Value = "{E7031C90-55FE-11D1-AE55-0000F80372B4}";
                            break;
                        case (esriFeatureType.esriFTComplexEdge):
                            //pGeometryType = esriGeometryType.esriGeometryPolyline;
                            pUidClsId.Value = "{A30E8A2A-C50B-11D1-AEA9-0000F80372B4}";
                            break;
                        case (esriFeatureType.esriFTAnnotation):
                            //pGeometryType = esriGeometryType.esriGeometryPolygon;
                            pUidClsId.Value = "{E3676993-C682-11D2-8A2A-006097AFF44E}";
                            break;
                        case (esriFeatureType.esriFTDimension):
                            //pGeometryType = esriGeometryType.esriGeometryPolygon;
                            pUidClsId.Value = "{496764FC-E0C9-11D3-80CE-00C04F601565}";
                            break;
                    }
                }
                #endregion
                #region pUidClsExt字段为空时
                if (pUidClsExt == null)
                {
                    switch (pFeatureType)
                    {
                        case esriFeatureType.esriFTAnnotation:
                            pUidClsExt = new UIDClass();
                            pUidClsExt.Value = "{24429589-D711-11D2-9F41-00C04F6BC6A5}";
                            break;
                        case esriFeatureType.esriFTDimension:
                            pUidClsExt = new UIDClass();
                            pUidClsExt.Value = "{48F935E2-DA66-11D3-80CE-00C04F601565}";
                            break;
                    }
                }
    
                #endregion
                string pNewFeatureClassName = pDemoFeatureClass.Name.Split('.')[1];
                try
                {
                    IFeatureClass pFeatureClass = pFeatureWorkspace.CreateFeatureClass(pNewFeatureClassName,pFields,pUidClsId,pUidClsExt,esriFeatureType.esriFTSimple,"SHAPE",String.Empty);
                    if (pFeatureClass != null)
                        return pFeatureClass;
                    else return null;
                }
                catch (Exception e)
                {
                    MessageBox.Show(e.ToString());
                    return null;
                }
            }

    其实在10.0版本以后,似乎只要Fields数组参数格式标准了(有OID和SHAPE包含GeometryDef)字段后,就不会报错,因此百度上也很少见到这个错误。CreateFeatureClass报错基本都是Fields参数出错。 
    2.设置GeometryDef_2时,提示 对 COM 组件的调用返回了错误 HRESULT E_FAIL 错误。如下图示:

    我找很多教程,发现都不是针对这个的,无意中看见了博客 
    http://www.cnblogs.com/qiushuixizhao/p/3242685.html 中的写法, 发现别人是先AddField之后再定义这个GeometryDef_2的,因此我改正过顺序,变成:先添加之后再定义GeometryDef_2,发现程序正常运行了。

     -----------------------------------------  补充分割线 ------------------------------------------------------
    错误:Microsoft Jet 数据库引擎找不到输入表或查询 'GDB_DataChanges'。 确定它是否存
    在FeatureWorkspace.CreateFeatureClass时候会出的错误,更详细一步是在它的参数内出错,一般在IFields创立时候会出错。仔细检查Field创立的步骤。
    CreateFeatureClass()方法参数详解:
    string Name,
         要创建的要素类名称
    IFields Fields,
          要创建的要素类中的字段,如果在geodatabase中创建了feature类,那么字段集合至少必须包含一个对象ID字段和一个形状字段。所需的字段可以从您希望创建的对象类型的类描述中获得(请参阅IObjectClassDescription上的RequiredFields属性)。
    UID CLSID,
        CLSID参数用于指定该类将包含的特性的类型。如果为CLSID传递了null值,那么geodatabase将返回类的特性实例。在大多数情况下,这是期望的行为。如果特性类用于存储自定义特性,则应该提供自定义特性的GUID。或者,可以使用IClassSchemaEdit接口在创建后改变特性类的CLSID。
    UID EXTCLSID,
          EXTCLSID参数用于指定什么类将被实例化为特性类扩展。该对象必须至少支持iclassex张力接口。如果为EXTCLSID参数传递null值,则feature类不会有与之关联的类扩展。由于不需要类扩展,所以这通常是期望的行为。如果特性类应该具有相关的扩展,则应该提供类扩展的GUID。或者,可以使用IClassSchemaEdit接口将创建后的类扩展关联起来。
    esriFeatureType FeatureType,
         esriFeatureType 要素类型,包括简单要素类,复杂要素,注记,维要素,Covering,Raster等。一般为:esriFeatureType.esriFTSimple详情见链接
    string ShapeFieldName,
          几何字段名称一般约定俗成为shape/SHAPE
    string ConfigKeyword  
          configurationKeywordparameter允许应用程序控制表在底层的物理布局RDBMS。例如,在Oracle数据库的情况下,配置关键字控制创建表的表空间,初始和下一个区段,以及其他属性。ArcSDE实例的配置关键词设置的ArcSDE数据管理员,并可用关键字的列表支持工作区使用IWorkspaceConfigurationinterface可以获得。
     
     
     

  • 相关阅读:
    NVI模式
    C#----接口与多继承
    C#----接口与抽象类
    C#----接口的显式实现
    C# -- 继承规则
    MVC多层架构
    BootStrap2学习日记23---弹出对话框
    APP导航设计九法
    DevExpress Grid使用checkBox选中的方法
    遗漏的SQL语句
  • 原文地址:https://www.cnblogs.com/marvelousone/p/7460062.html
Copyright © 2011-2022 走看看