• 【ArcEngine】多用户同时编辑同一个版本数据的解决方法


     

    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

    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

    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

  • 相关阅读:
    springcloud-Netflix创建服务消费者
    Spring Cloud Zuul
    Spring Cloud 熔断器
    树莓派连接启动SSH
    win10红警黑屏和无法打开的处理
    创建索引和主键
    SQL语句增加字段、修改字段、修改类型、修改默认值
    SQL Server 事务隔离级别详解
    SQL Server数据库锁机制及类型
    SQL Server中的锁类型及用法
  • 原文地址:https://www.cnblogs.com/vichang/p/7566649.html
Copyright © 2020-2023  润新知