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

【ArcEngine】多用户同时编辑同一个版本数据的解决方法的更多相关文章

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

    项目中做了入库的功能,测试一切正常,但是实际使用多个用户同时编辑default版本的时候,问题就来了,StopEditing 错误信息如下 FDO_E_VERSION_REDEFINED -21472 ...

  2. git 本地库推送远程库 版本冲突的解决方法

    参考: http://blog.csdn.net/shiren1118/article/details/7761203 github上的版本和本地版本冲突的解决方法 $ git push XXX ma ...

  3. 更新xcode后插件失效问题——不针对特定版本的通用解决方法

    一.Xcode更新后插件失效的原理 1.每次更新Xcode后插件都会失效,其实插件都还在这个目录好好的躺着呢: ~/Library/Application Support/Developer/Shar ...

  4. SQLServerException:将截断字符串或二进制数据的解决方法

    SQLServerException:将截断字符串或二进制数据的解决方法: 最近使用JPA进行保存对象到数据库中怎么也添加不进去,始终报错 主要原因就是你增加的数据字段长度超过数据库中字段所定义长度, ...

  5. resultMap中的collection集合出现只能读取一条数据的解决方法

    查询数据时只能获得collection集合中的的一条数据,相关情况如下: 结果集resultMap: <resultMap id="ManagerRolesAcls" typ ...

  6. .NET MVC Json()处理大数据异常解决方法

    [1-部分原文]: .NET MVC Json()处理大数据异常解决方法 整个项目采用微软的ASP.NET MVC3进行开发,前端显示采用EasyUI框架,图表的显示用的是Highcharts,主要进 ...

  7. mysql5.x升级到mysql5.7后导入之前数据库date出错的快速解决方法【mysql低版本数据导入到高版本出错的解决方法】

    mysql5.x升级至mysql5.7后导入之前数据库date出错,这是由于MySQL的sql_mode的影响,解决方法如下所示: [具体参考:mysql的sql_mode详解]修改mysql5.7的 ...

  8. Hive数据倾斜解决方法总结

    数据倾斜是进行大数据计算时最经常遇到的问题之一.当我们在执行HiveQL或者运行MapReduce作业时候,如果遇到一直卡在map100%,reduce99%一般就是遇到了数据倾斜的问题.数据倾斜其实 ...

  9. esayUi中datagrid中json串为空时,显示上一次数据的解决方法

    function initSearchProject(startDate,finishDate,flag) {        $("#finishDate").val(finish ...

随机推荐

  1. urllib库中的URL编码解码和GETPOST请求

    在urllib库的使用过程中,会在请求发送之前按照发送请求的方式进行编码处理,来使得传递的参数更加的安全,也更加符合模拟浏览器发送请求的形式.这就需要用urllib中的parse模块.parse的使用 ...

  2. LeetCode 847. Shortest Path Visiting All Nodes

    题目链接:https://leetcode.com/problems/shortest-path-visiting-all-nodes/ 题意:已知一条无向图,问经过所有点的最短路径是多长,边权都为1 ...

  3. 一文读懂k8s rbac 权限验证

    自我认为的k8s三大难点:权限验证,覆盖网络,各种证书. 今天就说一下我所理解的权限验证rbac. 咱不说rbac0,rbac1,rbac2,rbac3.咱就说怎么控制权限就行. 一.前言 1,反正R ...

  4. 【LeetCode】1207. 独一无二的出现次数

    1207. 独一无二的出现次数 知识点:set:哈希表 题目描述 给你一个整数数组 arr,请你帮忙统计数组中每个数的出现次数. 如果每个数的出现次数都是独一无二的,就返回 true:否则返回 fal ...

  5. HTML5-CSS(二)

    一. CSS  文本样式 1.font-size p { font-size: 50px;}解释:设置文本的大小. xx-small.x-small.small.medium.large.x-larg ...

  6. 在Java中,负数的绝对值竟然不一定是正数!!!

    绝对值是指一个数在数轴上所对应点到原点的距离,所以,在数学领域,正数的绝对值是这个数本身,负数的绝对值应该是他的相反数. 这几乎是每个人都知道的. 在Java中,想要获得有个数字的绝对值,可以使用ja ...

  7. java跨平台性说明

    一.举例说明 我们知道,只要是用标准C开发的程序,使用不同的编译器编译后的可执行文件是可以在对应平台运行的,比如windows可以使用VC编译,那编译后的exe文件就可以在windows下运行:liu ...

  8. SpringBoot添加Cors跨域配置,解决No 'Access-Control-Allow-Origin' header is present on the requested resource

    目录 什么是CORS SpringBoot 全局配置CORS 拦截器处理预检请求 什么是CORS 跨域(CORS)请求:同源策略/SOP(Same origin policy)是一种约定,由Netsc ...

  9. 解决ModuleNotFoundError: No module named 'pip'问题

    Python学习遇到小问题:ModuleNotFoundError: No module named 'pip' 今天想要装一下第三方库exifread的时候发现cmd窗口下无法执行pip命令,想了想 ...

  10. RHCE_DAY07

    文件共享服务FTP介绍 FTP(File Transfet Protocol):文件传输协议 FTP是一种在互联网中基于TCP协议端到端的数据传输协议 基于C/S架构,默认使用20.21号端口 端口2 ...