AE多用户同时编辑同一个版本数据的解决方法

项目中作了入库的功能,测试一切正常,可是实际使用多个用户同时编辑default版本的时候,问题就来了,StopEditing 错误信息以下html

FDO_E_VERSION_REDEFINED -2147217147 The version has been redefined to reference a new database state.

字面意思理解,保存的时候,版本状态已经被重定义了;也就是说保存以前没有协调到最新的版本状态。java

 

AE开发,arcmap是最好的老师,先看看arcmap是怎么处理这种状况的吧。在本机打开两个arcmap,模拟同时编辑的状况,第一次保存的一切正常,第二次保存的就会报错了,错误信息以下:web

Unable to create logfile system tables. User perhaps lacks permissions or resources to create tables数据库

1、设置SDE相关测试

通过查询得知,是须要修改日志文件(基于会话的日志文件 Session log filesspa

修改方法有三种:.net

1,经过sdeconfig -o alter 日志

2, 经过sdeconfig -o export importcode

3, 直接打开数据库表修改 server

修改内容 ALLOWSESSIONLOGFILE=TRUE;LOGFILEPOOLSIZE=20;具体修改方法,可参考引用文章1。

Insufficient permissions <-25> 若是发现这个错误,那么是你修改的时候使用的用户没有权限,你只有用sde用户才能修改server_config。

 

经过修改,如今arcmap中已是能够多用户同时编辑了,若是有冲突,会有冲突列表提示;若是内容合并,默认也会有合并提示,人工肯定后,能够保存。

若是在arcmap中不但愿弹出提示信息,能够在编辑选项中设置,设置方法,参见引用文章2

 

2、代码实现

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

 

PS:关于日志表详细介绍,能够查看引用文章6

 

参考文章

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

3. http://gis.stackexchange.com/questions/77299/why-unable-to-edit-arcsde-from-multiple-computers-on-lan-using-custom-arcgis-eng

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

相关文章
相关标签/搜索