ArcMap或ArcEngine中,使用多个用户同时编辑default版本的时候,问题就来了,StopEditing 错误信息如下
FDO_E_VERSION_REDEFINED | -2147217147 | The version has been redefined to reference a new database state. |
字面意思理解,保存的时候,版本状态已经被重定义了;也就是说保存之前没有协调到最新的版本状态。
AE开发,arcmap是最好的老师,先看看arcmap是怎么处理这种情况的吧。在本机打开两个arcmap,模拟同时编辑的情况,第一次保存的一切正常,第二次保存的就会报错了,错误信息如下:
Unable to create logfile system tables. User perhaps lacks permissions or resources to create tables
一、设置SDE相关
经过查询得知,是需要修改日志文件(基于会话的日志文件 Session log files)
修改方法有三种:
1,通过sdeconfig -o alter
2,通过sdeconfig -o export import
3,直接打开数据库表修改
修改内容 ALLOWSESSIONLOGFILE=TRUE;LOGFILEPOOLSIZE=20;具体修改方法,可参考引用文章1。
Insufficient permissions <-25> 如果发现这个错误,那么是你修改的时候使用的用户没有权限,你只有用sde用户才能修改server_config。
通过修改,现在arcmap中已经是可以多用户同时编辑了,如果有冲突,会有冲突列表提示;如果内容合并,默认也会有合并提示,人工确定后,可以保存。
如果在arcmap中不希望弹出提示信息,可以在编辑选项中设置,设置方法,参见引用文章2
PS:关于日志表详细介绍,可以查看引用文章6
二、AE代码实现
IVersionEdit.Reconcile Method ,用了协调版本之间的差异,直接使用,发现在多用户编辑的要素都不相同的时候,是可以正常协调的,但是如果编辑的是相同的要素,则无法检测到冲突。IVersionEdit4.Reconcile4 Method 这个方法同样也不行,然后继续搜索资料,根据引用文章3的方法,使用IMultiuserWorkspaceEdit.StartMultiuserEditing Method;使用该接口,可以正常协调合并,使用方法见引用文章4
主要代码
IMultiuserWorkspaceEditPtr ipMultiuserWorkspaceEdit; hr = ipMultiuserWorkspaceEdit->StartMultiuserEditing(esriMESMVersioned); //编辑。。。 ipWorkspaceEdit->StartEditOperation(); //........ ipWorkspaceEdit->StopEditOperation(); //必须在StopEditOperation后调用,否则会丢失编辑内容 IVersionedWorkspacePtr ipVersionedWorkspace = (IVersionedWorkspacePtr)ipWorkspaceEdit; IVersionPtr ipVersion; hr = ipVersionedWorkspace->get_DefaultVersion(&ipVersion); BSTR bVersionName=NULL; hr = ipVersion->get_VersionName(&bVersionName); IVersionEdit4Ptr ipVersionEdit4 = (IVersionEdit4Ptr)ipWorkspaceEdit; VARIANT_BOOL vbReconcile; hr = ipVersionEdit4->Reconcile4(bVersionName,VARIANT_TRUE,VARIANT_FALSE,VARIANT_TRUE,VARIANT_TRUE,&vbReconcile); if (VARIANT_TRUE == vbReconcile) { SHOW_MESSAGE_BOX(_T("检测到编辑冲突,请稍后再试")); return FALSE; } VARIANT_BOOL vbCanPost; hr = ipVersionEdit4->CanPost(&vbCanPost); if (VARIANT_TRUE == vbCanPost) { hr = ipVersionEdit4->Post(bVersionName); } hr = ipWorkspaceEdit->StopEditing(VARIANT_TRUE);
关于该部分的详细解释,可以参考引用文章5
C#实现
1 public void EditWithReconcile(IWorkspace workspace) 2 { 3 // Cast the workspace to the IMultiuserWorkspaceEdit and IWorkspaceEdit2 interfaces. 4 IMultiuserWorkspaceEdit muWorkspaceEdit = (IMultiuserWorkspaceEdit)workspace; 5 IWorkspaceEdit workspaceEdit = (IWorkspaceEdit)workspace; 6 7 // Start a versioned edit session and an edit operation. 8 muWorkspaceEdit.StartMultiuserEditing 9 (esriMultiuserEditSessionMode.esriMESMVersioned); 10 workspaceEdit.StartEditOperation(); 11 12 // Perform edits here... 13 // 编辑部分 14 // Save the edit operation. To cancel an edit operation, the AbortEditOperation 15 // method can be used. 16 workspaceEdit.StopEditOperation(); 17 try 18 { 19 // Stop the edit session. The saveEdits parameter indicates the edit session 20 // will be committed. 21 workspaceEdit.StopEditing(true); 22 } 23 catch (COMException comExc) 24 { 25 if (comExc.ErrorCode == (int)fdoError.FDO_E_VERSION_REDEFINED) 26 { 27 // Get the version name. 28 IVersion version = (IVersion)workspace; 29 String versionName = version.VersionName; 30 //state of reconcile 31 bool bReconciled; 32 // Reconcile the version. Modify this code to reconcile and handle conflicts 33 // appropriately for the specific application. 34 IVersionEdit4 versionEdit4 = (IVersionEdit4)workspace; 35 bReconciled = versionEdit4.Reconcile4(versionName, true, false, true, true); 36 //Posts the current version to the reconcilled version. 37 if(bReconciled && versionEdit4.canPost()) 38 versionEdit4.Post(versionName); 39 // Stop the edit session. 40 workspaceEdit.StopEditing(true); 41 } 42 else 43 { 44 // A different error has occurred. Handle appropriately for the application. 45 workspaceEdit.StopEditing(false); 46 } 47 } 48 }
参考文章
1. http://www.cnblogs.com/cannel/archive/2011/03/15/1985493.html
2. http://webhelp.esri.com/arcgisserver/9.3/java/index.htm#geodatabases/an_overv-60074501.htm
4. http://www.docin.com/p-458035218.html
5. http://blog.163.com/geliang0021@126/blog/static/3232232920121171127582/
6. http://blog.csdn.net/linghe301/article/details/8072907
7.【GIS帮助】http://127.0.0.1:47873/help/2-45016/?method=page&id=30aed52d-4ddc-4daf-b2fb-7dc3ca9a06ec&product=vs&productversion=100&locale=en-us