SDE数据编辑过程中异常中断后产生错误的处理
2011-06-17 10:39
651 查看
ArcSDE经常在数据导入或编辑过程中中断,其间有人为因素(调试中断)也有非人为因素(断网),中断后的直接恶果就是程序再次执行出错。错误号是-2147216556,错误解释是 FDO_E_OBJECTCLASS_REQUIRES_AN_EDIT_SESSION。
通常让写程序的人很郁闷,因为在程序中已经调用了StartEdit等,程序已经开始session编辑过程,确还报上述的错误。而事实上上是ArcSDE的空间索引已经在中断过程中被破坏了,需要重新计算。在我们对数据进行编辑的过程中,新添加记录或修改记录都会自动地去修改当前的要素类的索引,如果程序这时出错,空间索引的修改过程是无法完成的。导致我们在重新编辑数据的过程中无意中使用了无效的空间索引,在编辑过程中就会报-2147216556错误。
解决方法就是重新计算空间索引。重新计算空间索引在ArcGIS有很多种方法,可以用ArcCatalog属性页中Index项下操作索引编辑或重新计算功能。或者是采用GP下的重新计算索引工具。甚至也可以用代码来修改,在ArcObjects的帮助中,有如下的方法可以参考:
通常让写程序的人很郁闷,因为在程序中已经调用了StartEdit等,程序已经开始session编辑过程,确还报上述的错误。而事实上上是ArcSDE的空间索引已经在中断过程中被破坏了,需要重新计算。在我们对数据进行编辑的过程中,新添加记录或修改记录都会自动地去修改当前的要素类的索引,如果程序这时出错,空间索引的修改过程是无法完成的。导致我们在重新编辑数据的过程中无意中使用了无效的空间索引,在编辑过程中就会报-2147216556错误。
解决方法就是重新计算空间索引。重新计算空间索引在ArcGIS有很多种方法,可以用ArcCatalog属性页中Index项下操作索引编辑或重新计算功能。或者是采用GP下的重新计算索引工具。甚至也可以用代码来修改,在ArcObjects的帮助中,有如下的方法可以参考:
// Passing zero values for all three double parameters recalculates the spatial index with // acceptable (but not necessarily optimal) values. public void RebuildSpatialIndex(IFeatureClass featureClass, Double gridOneSize, Double gridTwoSize, Double gridThreeSize) { // Get an enumerator for indexes based on the shape field. IIndexes indexes = featureClass.Indexes; String shapeFieldName = featureClass.ShapeFieldName; IEnumIndex enumIndex = indexes.FindIndexesByFieldName(shapeFieldName); enumIndex.Reset(); // Get the index based on the shape field (should only be one) and delete it. IIndex index = enumIndex.Next(); if (index != null) { featureClass.DeleteIndex(index); } // Clone the shape field from the feature class. int shapeFieldIndex = featureClass.FindField(shapeFieldName); IFields fields = featureClass.Fields; IField sourceField = fields.get_Field(shapeFieldIndex); IClone sourceFieldClone = (IClone)sourceField; IClone targetFieldClone = sourceFieldClone.Clone(); IField targetField = (IField)targetFieldClone; // Open the geometry definition from the cloned field and modify it. IGeometryDef geometryDef = targetField.GeometryDef; IGeometryDefEdit geometryDefEdit = (IGeometryDefEdit)geometryDef; geometryDefEdit.GridCount_2 = 3; geometryDefEdit.set_GridSize(0, gridOneSize); geometryDefEdit.set_GridSize(1, gridTwoSize); geometryDefEdit.set_GridSize(2, gridThreeSize); // Create a spatial index and set the required attributes. IIndex newIndex = new IndexClass(); IIndexEdit newIndexEdit = (IIndexEdit)newIndex; newIndexEdit.Name_2 = shapeFieldName + "_Index"; newIndexEdit.IsAscending_2 = true; newIndexEdit.IsUnique_2 = false; // Create a fields collection and assign it to the new index. IFields newIndexFields = new FieldsClass(); IFieldsEdit newIndexFieldsEdit = (IFieldsEdit)newIndexFields; newIndexFieldsEdit.AddField(targetField); newIndexEdit.Fields_2 = newIndexFields; // Add the spatial index back into the feature class. featureClass.AddIndex(newIndex); }
相关文章推荐
- 扩展jQuery的方法统一处理AJAX调用过程中产生的异常错误信息
- Retrofit请求数据对错误以及网络异常的处理
- Oracle10g安装过程中"无法确定主机的IP地址时产生该异常错误" :解决办法(转)
- Oracle中函数,过程和触发器等的错误异常处理
- 解决 Oracle10g安装过程中"无法确定主机的IP地址时产生该异常错误"
- MYSQL 存储过程异常处理 报错 错误代码: 1337
- [MySQL] 存储过程错误异常处理例子 --> DECLARE EXIT HANDLER FOR SQLEXCEPTION
- mysql的存储过程里面异常处理模块 为什么获取不了错误码?
- [zz] Oracle10g安装过程中"无法确定主机的IP地址时产生该异常错误" :解决办法
- linux中断(与异常)处理过程
- Oracle10g安装过程中"无法确定主机的IP地址时产生该异常错误" :解决办法
- Retrofit请求数据对错误以及网络异常的处理
- CactiEz异常关机导致接收不到数据的故障处理过程
- 在使用SSH过程中,在JSP页面中对数据进行处理,出异常!
- Oracle10g安装过程中"无法确定主机的IP地址时产生该异常错误" :解决办法
- json文件中的特殊字符处理,放置json数据读取产生错误
- ONLINE方式在线重建索引异常中断后遇到ORA-08104错误的处理思路
- Oracle10g安装过程中"无法确定主机的IP地址时产生该异常错误" :解决办法
- 统一处理jquery ajax请求过程中的异常错误信息的机制
- PowerPC处理器上vxWorks 异常和中断处理过程解析