ArcEngine版本管理(Version)项目总结
需求:
在ArcGIS项目中,大型的数据库都是使用ArcSDE进行连接管理。使用的数据版本(Version)都是默认版本(sde.default)。这样多个人员在编辑的过程中就直接编辑的是默认版本数据。只要能够连接数据库就可以对默认版本进行随意的更改。一旦编辑保存到数据库之后就无法更改,除非有数据库备份,使数据编辑变得不灵活。
解决方案:
ArcGIS是有数据版本就出来了。数据库版本可以以默认版本(sde.default)为模板,创建多个子版本(Version)。然后用户编辑子版本的时候对父版本没有任何的影响。当数据编辑完后,确认数据编辑没有问题就可以将数据提交到默认版本(sde.default)。
环境:WIN10+ArcEngine10.1+ArcMap 10.1
资源:
ArcGIS Engine开发的ArcGIS 版本管理的功能
资源上面说的很清楚了,我就不重复了,说说开发中遇到的坑吧
1、创建版本(Version)所需权限
创建版本的时候需要GeodatabaseGDB的权限,如果没有在调用CreateVersoin方法的时候会出现如下错误:The application is not licensed to perform this operation

这个时候需要在LicenseControl控件勾选如下许可:

或者在代码许可注册的地方写成如下许可:
bool b = m_AOLicenseInitializer.InitializeApplication(
new esriLicenseProductCode[] { esriLicenseProductCode.esriLicenseProductCodeEngineGeoDB },
new esriLicenseExtensionCode[]
{
esriLicenseExtensionCode.esriLicenseExtensionCode3DAnalyst,
esriLicenseExtensionCode.esriLicenseExtensionCodeSpatialAnalyst
});
PS:
许可注册的时候只能注册一次,第二次无效。所以要确保第一次注册的许可能够创建版本。
2、子版本(Version)数据提交
在提交数据的时候,需要使用ArcEngine的IEngineEditor接口打开编辑,在调用StartEditing方法时需要传如工作空间(IWorkspace)和地图对象(IMap)。这里的工作空间需要和当前地图版本的工作空间统一(不同版本也存在各自的工作空间),否则调用StartEditing方法时会报错。所以在提交版本数据的时候需要将地图中的数据版本切换到当前提交的版本。
提交版本时需要调用Reconcile4方法进行冲突验证,否侧调用CanPost为false。验证冲突后如过有冲突需要马上解决,否则系统会自动解决冲突。
3、子版本数据编辑
如果使用ArcEngine开发的代码进行数据编辑,在编辑的时候需要调用IWorkspaceEdit的StartOperation方法,编辑结束后调用StopOperation方法。如果不调用该方法,编辑的数据会自动保存到父版本。
4、注册数据
编辑数据的时候需要注册数据,否则无法编辑数据,注册方法如下:

点击后会出现如下对话框,该对话框中的复选框比较重要:

"是否将该注册的图层编辑的基表内容进行同步"
因为新增版本相当于在数据库中插入了一条记录,用于该版本数据编辑时做记录。基表指的是父版本,如果勾选了,如果编辑了父版本的内容,当提交该版本的时候,父版本的其它子版本的父版本数据也会随之改变。这样造成冲突的情况就很很少。
如果不勾选,子版本提交的内容不会对其他子版本有任何影响,所以建议不勾选。
这里会产生疑问:如果两个字版本都编辑了父版本的相同内容。他们依次提交不会产生冲突么。
如果在注册数据的时候勾选了复选框,就不会产生冲突。因为一个子版本提交后。另一个的子版本的父版本数据也随之同步。这样就不会产生冲突。如果不勾选,就会产生冲突,这个时候就可以使用ArcGIS的冲突解决机制了。
ArcEngine版本管理(Version)项目总结的更多相关文章
- 10 Maven 版本管理
Maven 版本管理 一个健康的项目通常有一个长期.合理的版本演变过程.例如 Maven 本身的版本也比较多,如最早的 Maven1:Maven2 有 2.0.9.2.0.10.2.1.0.2.2.0 ...
- 《Maven实战》第13章 版本管理
版本管理:项目整体版本的演变过程的管理,如从1.0-SNAPSHOT到1.0,再到1.1-SNAPSHOT 版本控制:借助版本控制工具追踪代码的每一个变更 13.1什么是版本管理 版本管理:项目整体版 ...
- Maven项目中的pom.xml详解【转】
什么是pom? pom作为项目对象模型.通过xml表示maven项目,使用pom.xml来实现.主要描述了项目:包括配置文件:开发者需要遵循的规则,缺陷管理系统,组织和licenses,项目的url, ...
- [BI项目记]-对项目文件进行规划
BI项目中会有很多不同种类的项目,此篇会对这些项目进行一个总结,并且在TFS中进行分类. 根据笔者对BI项目的经验和理解,主要将BI项目中的项目类型进行如下分类: DB脚本 DB脚本是BI项目中重要的 ...
- Maven项目pom.xml文件详解
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/20 ...
- 规范化的软件项目演进管理--从 Github 使用说起
规范化的软件项目演进管理 从 Github 使用说起 1 前言 首先,本文的层次定位是:很基本很基础的 Github 工具的入门级应用,写给入门级的用户看的. 基本上工作过几年的人,下面描述的这些 ...
- 项目开发之使用 maven
本文将详述 maven 在软件项目中的使用.首先讲述 maven 的基本工作原理及环境的搭建.然后讲述开发及配置管理人员如何使用 maven,最后将介绍 maven 与 eclipse 集成使用. m ...
- 使用maven编译Java项目 http://www.tuicool.com/articles/YfIfIrq
使用maven编译Java项目 时间 2014-07-17 17:42:37 Way Lau's Blog 原文 http://www.waylau.com/build-java-project- ...
- Maven实战(二)构建简单Maven项目
上一节讲了maven的安装和配置,这一节我们来学习一下创建一个简单的Maven项目 1. 用Maven 命令创建一个简单的Maven项目 在cmd中运行如下命令: mvn archetype:gene ...
随机推荐
- Ubuntu16.04.3深度学习环境搭建
依赖 pip3 install pillow 安装numpy相关sudo apt-get install python-numpy python-scipy python-matplotlib ipy ...
- Lifecycle mapping "org.eclipse.m2e.jdt.JarLifecycleMapping" Eclipse Maven报错
eclipse 项目中报错Lifecycle mapping "org.eclipse.m2e.jdt.JarLifecycleMapping" is not available, ...
- navicat ssh通道受限问题处理
navicat 链接数据库 使用navicat 的ssh通道连接数据库回遇到权限问题 错误代码如下: 80070007: SSH Tunnel: Server does not support dif ...
- Python--day61--Django中的app
- UVA 11732——Trie
解题思路: 首先我们可以发现: 1.若两个字符串A.B不相等,且它们的公共前缀为S,则它们的比较次数为:2 * len(S) + 1: 2.若两个字符串相等,设为A,则它们的比较次数为 2 * ( l ...
- 通过作用域链解析js函数一些难以理解的的作用域问题
基本原理 js函数在执行时,系统会创建一个隐式的属性scope,scope中存储的是函数的作用域链. 通过对这个scope的分析,就能解释JavaScript中许多难以理解的问题: 例1: funct ...
- P1021 整数奇偶排序
整数奇偶排序 题目出处:<信息学奥赛一本通>第二章上机练习6,略有改编 题目描述 告诉你包含 \(n\) 个数的数组 \(a\) ,你需要把他们按照"奇数排前面,偶数排后面:奇数 ...
- 【codeforces 749B】Parallelogram is Back
time limit per test1 second memory limit per test256 megabytes inputstandard input outputstandard ou ...
- 测试驱动开发实践—从testList开始
[内容指引]运行单元测试:装配一条数据:模拟更多数据测试列表:测试无搜索列表:测试标准查询:测试高级查询. 一.运行单元测试 我们以文档分类(Category)这个领域类为例,示范如何通过编写测试用例 ...
- C# 获取进程退出代码
我需要写一个程序,让这个程序知道另一个程序是否正常退出,于是就需要获取这个进程的退出代码 在程序如果需要手动退出,可以设置当前的退出代码 static void Main(string[] args) ...