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. flex布局制作自适应网页

    网页布局是css的一个重点应用.传统的布局都是依赖display.position.float属性来实现的,但是特殊布局就不易实现,如垂直居中. 01 flex布局是什么?‍ Flex 是 Flexi ...

  2. CSS从入门到喜欢,从喜欢到着魔

    如果把网页比作一个人的话,html就是他的骨架,而css是他的皮肤,javascript是神经控制着行动.html,css,javascript都是构建网页的核心技术. CSS简介 css指的是层叠样 ...

  3. 何为“Secure Contexts”安全内容? 终于说明白了!

    ​​​何为"Secure Contexts"安全内容? 终于说明白了! 看图说话 [途径1]:地址栏输入: edge://flags/ 按需设置选项后,重启浏览器即可. Allow ...

  4. 家庭账本开发day08

    对查询到额数据进行相关的操作,删除.对删除按钮绑定事件 点击后发送ajax请求到servlet,删除相关的数据后,返回flag到前端 若后台删除成功,则前台进行相应的.close():输出点击行的数据 ...

  5. 【论文阅读】套娃之 Blog for DMP Dynamic Movement Primitives

    前言:原笔记Notion链接:https://www.notion.so/Blog-for-DMP-d34e83c05eb944ba989fc8bf9b0c0f7b 如有格式显示问题等请点击此处查看 ...

  6. ls仅列出当前目录下的所有目录

    ls -d */ -d仅列出目录本身,而不列出其中的内容 *通配符,所有的字符 /目录的标识

  7. [HAOI2012]外星人 题解

    人类智慧题. 首先,只有 \(\varphi(1)=\varphi(2)=1\).再考虑题目中给的提示: \[\varphi\left(\prod_{i = 1}^m p_i^{q_i}\right) ...

  8. Java 中节省 90% 时间的常用的工具类

    前言 你们有木有喜欢看代码的领导啊,我的领导就喜欢看我写的代码,有事没事就喜欢跟我探讨怎么写才最好,哈哈哈...挺好. 今天我们就一起来看看可以节省 90% 的加班时间的第三方开源库吧,第一个介绍的必 ...

  9. Resnet网络详细结构(针对Cifar10)

    Resnet网络详细结构(针对Cifar10) 结构 具体结构(Pytorch) conv1 (conv1): Conv2d(3, 64, kernel_size=(3, 3), stride=(1, ...

  10. Spring Cloud分区发布实践(2) 微服务

    我们准备一下用于查询姓名的微服务. 首先定义一下服务的接口, 新建一个空的Maven模块hello-remotename-core, 里面新建一个类: public interface RemoteN ...