在《ArcGIS离线数据编辑【一】》中介绍了ArcGIS的离线数据编辑技术的主要实现过程,本节将在上文的基础上介绍在离线数据编辑中的ArcSDE数据库版本的管理有关内容。
设定当前的ArcSDE数据库中除了默认的Default版本外,在Default版本基础上创建两个子版本V1、V2,并将这三个版本分别赋予sde、Version1、Version2三个用户。
分别以V1、V2两个版本登录,执行相应的离线编辑,确保编辑后的结果在向其父版本提交时存在冲突。
在提交版本过程中,首先使用IWorkspaceEdit4接口的Reconcile4方法进行版本协调,监测是否存在冲突;Reconcile4方法参数要根据冲突解决方案来设定
监测出来的冲突提供了如下三种解决方案:
(1)数据库版本替换当前版本:使用Default版本中的内容替换当前提交的版本。
(2)当前版本替换数据库版本:使用当前提交的编辑版本替换Default版本中的内容。
(3)用户自定义冲突解决方案:根据实际的情况对冲突要素实体逐个解决。
版本提交的源代码:
publicstaticvoid CommitVsn(IWorkspacewsp, clsPublic.ConflictCheck pCheck, AxMapControl sMapCtrl)
{
IWorkspaceEdit pWSE = wsp asIWorkspaceEdit;
IVersionEdit4 pVsnE = wsp asIVersionEdit4;
try
{
boolbLock = true;
boolbabortIfConflict = false;
boolbChildWin = false;
boolbattributeCheck = true;
if(pCheck == clsPublic.ConflictCheck.Current)
bChildWin = true;
pWSE.StartEditing(false);
if(!pWSE.IsBeingEdited()) return;
pWSE.StartEditOperation();
if(!pVsnE.Reconcile4(“SDE.DEFAULT”, bLock, babortIfConflict, bChildWin,battributeCheck))
{
if(pVsnE.CanPost())
{
pVsnE.Post(“SDE.DEFAULT”);
pWSE.StopEditOperation();
}
else
{
pWSE.AbortEditOperation();
}
pWSE.StopEditing(true);
}
else
{
if(pCheck == clsPublic.ConflictCheck.UserDefine)
{
//用户自定义处理过程
SortedList<string, IConflictClass>sConflictClassLst = newSortedList<string, IConflictClass>();
IVersionEdit pVsnEdit = wsp asIVersionEdit;
CheckConflictClass(pVsnEdit, sConflictClassLst);
if (sConflictClassLst.Count == 0)
{
pVsnE.Post(“SDE.DEFAULT”);
pWSE.StopEditOperation();
pWSE.StopEditing(true);
}
else
{
frmManageConflict pfrm = newfrmManageConflict(pVsnEdit,sConflictClassLst,sMapCtrl);
pfrm.ShowDialog();
bool bAllManage = pfrm.IsAllManage;
pfrm.Dispose();
if (bAllManage)
{
pVsnE.Post(“SDE.DEFAULT”);
pWSE.StopEditOperation();
pWSE.StopEditing(true);
}
else
{
pWSE.AbortEditOperation();
pWSE.StopEditing(false);
}
}
}
elseif (pCheck == clsPublic.ConflictCheck.Current)
{
pVsnE.Post(“SDE.DEFAULT”);
pWSE.StopEditOperation();
pWSE.StopEditing(true);
}
elseif (pCheck == clsPublic.ConflictCheck.DataBase)
{
pWSE.StopEditOperation();
pWSE.StopEditing(true);
}
}
MessageBox.Show(“版本提交完毕!“, “提示“, MessageBoxButtons.OK, MessageBoxIcon.Information);
}
catch (Exception pEr)
{
MessageBox.Show(pEr.Message,“提示“, MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
pWSE.AbortEditOperation();
pWSE.StopEditing(false);
}
}