创建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可以获得。
 
 
 

转载于:https://www.cnblogs.com/marvelousone/p/7460062.html

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值