AE编辑矢量必须需要IWorkspaceEdit开启StartEditing吗
平时大量读写矢量数据属性不多,偶尔操作少量矢量数据的时候,习惯不去开启编辑状态。
今天好奇百度总结了下下什么时候应该开启编辑状态。
一、总结
- 所作操作需要恢复和重做,特别是长事务操作。
- 防止存储失败。
- 连接数据库时。
- 开启编辑要先注册版本。
二、疑惑
编辑shp时需不需开启编辑?
之前似乎遇到了和这里 StartEditing()的问题 同样的问题
void UpdateFeature(IFeature iF,IGeometry iGeo)
{
IDataset iDataset = iF.Class as IDataset;
IWorkspaceEdit iWorkSpaEdit = iDataset.Workspace as IWorkspaceEdit;
//iWorkSpaEdit.StartEditing(true);//为什么有了这段代码就不行了.
iWorkSpaEdit.StartEditOperation();
iF.Shape = iGeo;
iF.Store();
iWorkSpaEdit.StopEditOperation();
//iWorkSpaEdit.StopEditing(true);
}在更新shape文件的时候,发现了一个问题,iWorkSpaEdit.StartEditing(true);//使用了这个代码之后,总是 iF.Store();后马上退出,造成无法编辑.
后来请教一位同事,他说shape不需要,因为不会存在多用户编辑的问题.
三、参考
参考一: IWorkspaceEdit的一些思考
今天终于完成VCT的转换,远远超出了预计的时间。主要是没有把几何数据显示出来,也就是没有存储下来。终其原因,没有把得到 IGeometry的feature调用store,也就是没有保存几何信息。而featureclass则会显示你创建了该feature。所以从属性上面的纪录数来看,还以为是对的。
另外,一开始不知道,不调用IWorkspaceEdit也可以使用feature.stroe。主要还是一开始受前辈影响吧。今天仔细察看了IWorkspaceEdit的说明文件,上面说,当要编辑物体时候,最好还是要打开编辑状态,除非是个别物体编辑时候。当与数据库连接的时候,就必须使用编辑状态了。里面有七条规则,可以参阅。
另外还要说的是,如果打开了编辑状态,就一定要调用feature.store,或则调用discard。不然会有时抛出异常。我想是这样的,编辑状态,但是看IWorkspace这类名,就知道是创建了一个工作空间,当改变的信息没有被feature保存的时候,工作空间并不会自动释放存储的改变信息,而这个时候关闭工作空间和编辑状态,那么这些内存就会泄露,抛出异常,也是情理之中了
参考二: 关于开启编辑的详细描述,七条规则可以读读 StartEditOperation与StartEdit
这也是我们所说的事务,如果想操作能返回和重做,就必须把代码写在IWorkspaceEdit的StartEditing()和StopEditing()函数之间,把相关的操作写在IWorkspaceEdit的StartEditOperation()和StopEditOperation()之间。
参考三: 这里内容丰富 IWorkspaceEdit接口
强烈建议使用edit session在edit operation中执行insert,update或delete操作。虽然不用明确指出开始和结束一个edit operation,但这样做结果是不确定的,取决于数据库操作时的状态,甚至所做的修改不能实现而出错。基于这个原因,所有编辑操作都应在edit operation中。
Geodatabase确保了edit session期间database中的row对象的唯一实例。地理数据库不支持嵌套事务,在SDE地理数据库中有版本的环境中编辑时一次只能打开一个事务。这就是说,在一个连接下编辑多个版本时,在另一个版本上调用StartEditing时要首先在第一个版本上调用StopEditing。在关闭第一个事务之前打开另一个事务,将返回应用程序一个oper transaction错误。在程序中调用先IsBeingEdited再调用StartEditing可以避免这个错误。使
参考四:ArcGIS 10——版本编辑流程
在默认情况下,ArcMap编辑会话被设置为执行版本编辑。表示只能编辑已注册为版本的数据。
ArcMap中每个编辑会话只能编辑一个版本。因此如果地图引用了一个版本,则该版本自动打开以供编辑;如果引用了多个版本,则必须选择其中一个版本来进行编辑。
作者:AllenRobin http://gisrsman.cnblogs.com