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. css颜色介绍和背景设置

    现在美丽网页的设计图中颜色五花八门的,网页模块中漂亮背景图也很多,网页中颜色和背景设置必不可少,接下来我们就先学颜色是如何表达的,要知其然,知其所以然. 颜色表达形式 1.RGB:rgb( red, ...

  2. Long类型框架自动序列化成String失效问题排查

    目录 问题描述 猜想 1. 写错了 2. 重新使用 验证猜想 1.验证猜想 2.继续猜想 3.再次猜想 4.再次验证 5.疑惑 6.找到原因,解决疑惑 7.解决 问题描述 微服务架构下进行业务模块开发 ...

  3. python -- 程序异常与调试(程序调试)

    一.程序调试 A.使用assert语句检测程序代码中的错误. assert 表达式[, 参数] 如果表达式为True,则继续往下运行:如果为False,则抛出一个AssertionError异常,并且 ...

  4. 微信小程序云开发-云存储的应用-识别身份证(正面和反面)

    一.准备工作 1.创建云函数identify 2.云函数identify中index.js代码 1 // 云函数入口文件 2 const cloud = require('wx-server-sdk' ...

  5. Linux CentOS 7 在Apache服务器上安装SSL证书

    在开发微信小程序的时候,wx.request请求的地址必须是https的,所以只能重新配置服务器. 域名和服务器都是在阿里云上买的,系统是CentOS7,安装了Apache服务器.网上也找了一下,很多 ...

  6. CSP-S 2020 初赛

    游记 游记个鬼啊跨条街就到了=-= 不分Day反正就一天. 9:30开考,8:30起床. 下雨了,一出宿舍门整个学校全被白色的雾气笼罩.愚以为这是祥瑞之气,昨夜似有麒麟貔貅路过,祝我今日初赛RP++ ...

  7. ESLint自用规则

    官方文档地址 rules: { // allow async-await 'generator-star-spacing': 'off', // allow debugger during devel ...

  8. odoo14里面的消息机制

    odoo里面 字段追踪.消息通知机制:  一.使用方式:1.在定义模型的py文件里继承mail模型 class DemoModle(models.Model): """ ...

  9. jquery点击空白处事件

    $(document).live('click',function(){       $('.emails').hide();   }); 此代码为点击空白处,'emails',标签隐藏.

  10. PHP 接受提交变量过滤类

    Filter.class.php      : 1 <?php 2 class Filter{ 3 4 /** 5 * 将\n转化为<br/> 6 * 7 * @param stri ...