1、问题提出
在我的上一篇博文中(ArcGIS编辑SDE的矢量数据(集)(解决因版本化问题不能编辑))解决了在ArcGIS中编辑sde时遇到的未注册导致不能编辑的问题,同样,在ArcEngine中也可以用同样的思路解决这个问题。这个问题比较简单,所以为了增加篇幅,我在这篇博文中整理了一下我解决ArcEngine问题的一贯思路,如果比较赶时间可以跳过第二部分。
2、解决思路
我始终坚信遇到问题最好的解决办法第一是帮助文档,第二是百度谷歌,所以在已经知道在ArcGIS中如何解决这个问题之后就可以在帮助文档中查找相关内容,我们在帮助文档中搜索“RegisterAsVersioned”,得到了下图的结果:
这就可以知道我们应该调用“IVersionedObject”接口,按照ArcGIS的一贯做法,当然是调用最新的接口IVersionedObject3。
接下来我们把目光转移到对象模型图(安装ao的路径下找),这个接口是在ESRI.ArcGIS.Geodatabase命名空间下,所以可以打开“GeoDatabaseObjectModel”,搜索IVersionedObject3,得到这个接口是在这里,这是个抽象类:
所以我们可以这样去实现它:
IVersionedObject3 versionedObject = pDataSet as IVersionedObject3;
接下来的步骤就和在arcgis中实现基本上一样了。
3、代码实现:
网上我找了很多资料,这些代码大多只是将编辑的模式设置未版本化模式,但是并没有说怎样进行版本化,所以,首先先判断这个数据集是否已经注册了版本,如果注册了版本就直接设置编辑模式未版本化编辑,否则,就需要先注册版本再编辑。按照这个逻辑,代码就应该是这样的:
if (pWorkspace.Type == esriWorkspaceType.esriRemoteDatabaseWorkspace)
{
IVersionedObject3 versionedObject = pDataSet as IVersionedObject3;
//注册版本
if (versionedObject != null)
{
versionedObject.RegisterAsVersioned(true);
}
pEngineEditor.EditSessionMode = esriEngineEditSessionMode.esriEngineEditSessionModeVersioned;
}
//else
//{
// pEngineEditor.EditSessionMode = esriEngineEditSessionMode.esriEngineEditSessionModeNonVersioned;
//}
//设置编辑任务
pEngineEditor.StartEditing(pWorkspace, pMap);
如果对没有注册版本的sde数据集抢行进行编辑操作,那么就会报错:HRESULT:0x80040356