Distributed Geodatabase Development-Best Practices
Distributed Geodatabase Development-Best Practices
(Best Practices)
Khaled Hassen
Gary MacDougall
Schedule
• 75 minute session
– 60 – 65 minute lecture
– 10 – 15 minutes Q & A following the lecture
• Cell phones and pagers
• Prerequisites
– Understand versioning
– Have reviewed the geodatabase replication on-line help and
developer documentation
• All code examples and demos are in C#
Overview
Office Office
Office Office
Production / Publication
Multiple levels
Main Office
Editors Readers
ArcGIS
Regional Regional Regional ArcIMS
Office Office Office Server
edits
Checkout/ Child
Parent
check-in geodatabase geodatabase
Once only
edits
edits
Two-way Parent Child
geodatabase Multiple times geodatabase
Geodatabase Replication Workflows
machine
Data distribution in
Enterprise systems
A
9.3 Geodatabase Replication
• GeoDatabaseDistributed library
• Coarse Grained API (Recommended)
• GeoDataServer Object Model – new at ArcGIS 9.2
• Stateless object model
• Geodatabase replication, browsing, querying, data
extraction
• Fine grained API
• Pre-ArcGIS 9.2 object models
– Data Extraction and Check out/Check in Object Model, XML Export and
Import Object Model
• Object models for specialized operations such as
browsing the contents of a delta file
– Data Changes Object Model, Schema Change Export and Import Object
Model
Geodatabase Replication – API
Geodatabase Distributed
Library
Internet
Coarse Grained API Remote
(GeoDataServer object model) Geodatabase
Lo
ca
l
Fine Grained API
(Data Extraction Check out/
Check in object model; XML
Export and Import Object Local Local
Model; Data Changes Object Geodatabase
Model; Schema Change
Export and Import Object
Model)
Supports Connected and Disconnected
Environments
• Connected
– All replicas accessible on the network (LAN or WAN)
– Always connected or intermittently connected
• Example: to synchronize, use the synchronize wizard in
ArcCatalog
• Disconnected
– Replicas are not on the same network
– Message exchange is performed by the end user
– Operations are performed by export, file transfer and import
• Example: to synchronize, export changes to a delta XML file,
transfer the file (ftp, CD through the mail, etc.), have the file
imported on the relative replica when it arrives, send
acknowledgement message back to sender
Connected and Disconnected Environments
Connected Disconnected
LAN LAN
XML XML
ReplicationAgent
• Replica creation
• Replica synchronization
• Replication extensibility
• Steps
n Initialize a GeoDataServer for the source and target
geodatabases
o Create a GPReplicaDescription to define the data to be
replicate from the source
p Use the GPReplicaOptionsClass to define replica options
such as the replica type
q Use the ReplicationAgent to create the replica
Initializing GeoDataServers
try
try {{
IGPReplicaDatasets
IGPReplicaDatasets iERDatasets
iERDatasets ==
iGDS.ExpandReplicaDatasets(iGPRDatasets);
iGDS.ExpandReplicaDatasets(iGPRDatasets);
}}
catch
catch (Exception
(Exception e)
e) {{ return
return null;
null; }}
iGPRDescription.GPReplicaDatasets
iGPRDescription.GPReplicaDatasets == iERDatasets;
iERDatasets;
iGPRDescription.SingleGeneration(false);
iGPRDescription.SingleGeneration(false);
……
return
return iGPRDescription;
iGPRDescription;
}}
Set the replica options
p Use the GPReplicaOptionsClass to define replica
options such as the replica type
//
// Set
Set the
the replica
replica options
options
IGPReplicaOptions
IGPReplicaOptions iReplicaOptions
iReplicaOptions == new
new GPReplicaOptionsClass();
GPReplicaOptionsClass();
//
// Set
Set type
type to
to 22 way
way replica
replica
iReplicaOptions.AccessType
iReplicaOptions.AccessType == esriReplicaAccessType.esriReplicaBothReadWrite;
esriReplicaAccessType.esriReplicaBothReadWrite;
//
// Important
Important only
only for
for replicas
replicas in
in disconnected
disconnected environments
environments
iReplicaOptions.IsChildFirstSender
iReplicaOptions.IsChildFirstSender == true;true;
//
// Copy
Copy the
the data
data during
during creation
creation
iReplicaOptions.RegisterReplicaOnly
iReplicaOptions.RegisterReplicaOnly == false;
false;
Create the replica
try
try {{
iRepAgent.CreateReplica(rVersion,
iRepAgent.CreateReplica(rVersion, iGDSParent,
iGDSParent, iGDSChild,
iGDSChild, rName,
rName,
iRepDesc, iRepOptions);
iRepDesc, iRepOptions);
}}
catch
catch (Exception
(Exception e)
e) {…}
{…}
}}
• Steps
n Create the replica to a transport file
– initialize geodataserver, create
replicadescription, set replica options (as
shown in connected)
– Use the GDSExportOptionsClass to define
export options such as output format
– Use the GeoDataServer to create the replica
to an output file
o Transfer the transport file to the target
p Import the transport file on the target to complete replica
creation
Create the replica to a transport file
n Create the replica to a transport file from source
CreateReplicaDisconnected(GDSParent,
CreateReplicaDisconnected(GDSParent, RepDescription,
RepDescription, ReplicaOptions)
ReplicaOptions)
……
public
public void
void CreateReplicaDisconnected(IGeoDataServer
CreateReplicaDisconnected(IGeoDataServer iGDSParent,
iGDSParent,
IGPReplicaDescription iRepDesc, IGPReplicaOptions iReplicaOptions)
IGPReplicaDescription iRepDesc, IGPReplicaOptions iReplicaOptions)
{{
String
String rVersion
rVersion == “MyWork”,
“MyWork”,
rName
rName == “MyReplica;
“MyReplica;
esriGDSTransportType
esriGDSTransportType trType
trType == esriGDSTransportTypeUrl;
esriGDSTransportTypeUrl;
IGDSExportOptions
IGDSExportOptions iGDSEOptions
iGDSEOptions == new
new GDSExportOptions();
GDSExportOptions();
iGDSEOptions.ExportFormat
iGDSEOptions.ExportFormat == esriGDSExportFormat.esriGDSExportFormatXml;
esriGDSExportFormat.esriGDSExportFormatXml;
iGDSEOptions.Compressed
iGDSEOptions.Compressed == true;
true;
iGDSEOptions.BinaryGeometry
iGDSEOptions.BinaryGeometry == false;
false;
try
try {{
IGDSData
IGDSData iGDSData
iGDSData == iGDSParent.CreateReplica(rVersion,
iGDSParent.CreateReplica(rVersion, rName,
rName,
iRepDesc, iReplicaOptions, iGDSEOptions, esriGDSTransportTypeUrl);
iRepDesc, iReplicaOptions, iGDSEOptions, esriGDSTransportTypeUrl);
}}
catch
catch (Exception
(Exception e)
e) {…}
{…}
}}
Transport the file and Import
o File can transported manually or automatically
– Manual example: burn file to CD and send through US Mail
– Automated example: use a data distributed service to FTP files
on a regular basis
p Importing the transport file on the target
– Initialize a GeoDataServer for the target and use ImportData
method
//
// reference
reference the
the file
file to
to import
import with
with the
the GDSData
GDSData object
object
IGDSData
IGDSData iGDSData
iGDSData == new
new GDSDataClass();
GDSDataClass();
iGDSData.TransportType
iGDSData.TransportType == esriGDSTransportType.esriGDSTransportTypeURL;
esriGDSTransportType.esriGDSTransportTypeURL;
iGDSData.Compressed
iGDSData.Compressed == true;
true;
iGDSData.URL
iGDSData.URL == @“D:\filestoimport\myreplica.zip";
@“D:\filestoimport\myreplica.zip";
//
// Import
Import the
the replica
replica workspace
workspace document
document to
to create
create the
the replica
replica
iGDSChild.ImportData(iGDSData,
iGDSChild.ImportData(iGDSData,
esriGDSImportFormat.esriGDSImportFormatXmlWorkspace)
esriGDSImportFormat.esriGDSImportFormatXmlWorkspace)
HRESULT
HRESULT AfterCreatingReplicaEvents(BSTR
AfterCreatingReplicaEvents(BSTR replicaName,
replicaName,
esriReplicaType
esriReplicaType rType,
rType,
IReplicaDescription*
IReplicaDescription* iRDesc,
iRDesc,
IWorkspace* iChildWS);
IWorkspace* iChildWS);
};
};
WorkspaceExtension With ReplicaEvents
Interface
public void IWorkspaceReplicaEvents :: IUnknown
RegisterExtension(IWorkspace iWS,
Interface
public voidIWorkspaceReplicaEvents
RegisterExtension(IWorkspace iWS, String
IUnknown String extGUID)
extGUID)
{{{{
HRESLT
HRESLT BeforeCreatingReplicaEvents(BSTR
IWorkspaceExtensionManager iWSMgr replicaName,
iWSMgr == iWS
BeforeCreatingReplicaEvents(BSTR
IWorkspaceExtensionManager iWS as IWorkspaceExtensionManager;
asreplicaName,
IWorkspaceExtensionManager;
UID esriReplicaType
esriReplicaType rType,
UID uid
uid == new
new UID();
UID(); rType,
uid.Value IReplicaDescription
IReplicaDescription rDesc,
uid.Value == extGUID;
extGUID; rDesc,
IWorkspaceExtension IWorkspace*
IWorkspace* childWS);
IWorkspaceExtension iWSExtiWSExt == iWSMgr.FindExtension(uid);
childWS);
iWSMgr.FindExtension(uid);
if
if (iWSExt
(iWSExt == == null)
null) {{
HRESULT
try AfterCreatingReplicaEvents(BSTR }} replicaName,
try {{ iWSMgr.RegisterExtension(uid);
HRESULT AfterCreatingReplicaEvents(BSTR
iWSMgr.RegisterExtension(uid); replicaName,
catch esriReplicaType
esriReplicaType rType,
catch (COMException
(COMException ce)ce) {…}
{…} rType,
}} IReplicaDescription
IReplicaDescription rDesc,
rDesc,
}} IWorkspace*
IWorkspace* childWS);
childWS);
};
Replica Creation Demo
DLL
2. Register workspace
extension
3. Create Replica
Before event
Parent Child
After event
Altering Replica Definition
Replica description can be changed after creating a replica
public
public void
void AlterReplica(IWorkspace
AlterReplica(IWorkspace iWS,
iWS, string
string tableName,
tableName, string
string dbase,
dbase,
string owner
string owner
)) {{
IWorkspaceReplicas
IWorkspaceReplicas iWR
iWR == iWS
iWS new
new IWorkspaceReplicas;
IWorkspaceReplicas;
IReplica
IReplica iReplica
iReplica == iWS.get_ReplicaByName(“MyReplica”);
iWS.get_ReplicaByName(“MyReplica”);
IReplicaDescription
IReplicaDescription iRDiRD == iReplica.Description;
iReplica.Description;
int
int index
index == iRD.FindTable(tableName);
iRD.FindTable(tableName);
IReplicaFilterDescriptionEdit
IReplicaFilterDescriptionEdit iFD
iFD == iRD
iRD as
as IReplicaFilterDescriptionEdit;
IReplicaFilterDescriptionEdit;
iFD.put_RowsType(index,
iFD.put_RowsType(index, esriRowsType.esriRowsTypeAll);
esriRowsType.esriRowsTypeAll);
IWorkspaceReplicasAdmin
IWorkspaceReplicasAdmin iRAdmin
iRAdmin == iWR
iWR as
as IWorkspaceReplicasAdmin;
IWorkspaceReplicasAdmin;
try
try {{
iRAdmin.AlterReplica(iReplica);
iRAdmin.AlterReplica(iReplica);
}}
catch
catch (COMException
(COMException ce)
ce)
{…}
{…}
}}
Adding a Dataset to a Replica
• Steps
n Initialize a GeoDataServer for the source and target
geodatabases
o Use the ReplicationAgent to Synchronize the replica
//
// Sync
Sync the
the replica
replica
IReplicationAgent
IReplicationAgent iRepAgent
iRepAgent == new
new ReplicationAgentClass();
ReplicationAgentClass();
iRepAgent.SynchronizeReplica(iParentGDS,
iRepAgent.SynchronizeReplica(iParentGDS, /*
/* Parent
Parent geodataserver
geodataserver */
*/
iChildGDS,
iChildGDS, /* child geodataserver
/* child geodataserver */*/
iGPReplicaParent,
iGPReplicaParent, /*
/* Parent
Parent replica
replica */
*/
iGPReplicaChild,
iGPReplicaChild, /*
/* Child
Child replica
replica */
*/
esriRAResolveConflictsInFavorOfReplica1,
esriRAResolveConflictsInFavorOfReplica1, /* /* Reconcile
Reconcile policy
policy */
*/
esriReplicaSynchronizeBoth,
esriReplicaSynchronizeBoth, /*
/* Sync
Sync Direction
Direction */
*/
true);
true); /*
/* true
true == column
column level
level conflicts
conflicts detection
detection */
*/
• Steps
n Export replica changes to a transport file
o Transfer the transport file to the target
• Manual example: burn file to CD and send
through US Mail
• Automated example: use a data distributed
service to FTP files on a regular basis
p Import the transport file on the target to complete replica
synchronization
See How to synchronize a replica in a disconnected environment
Synchronizing Replicas (Exporting Changes)
Replica changes can be exported to xml, fileGDB, or personal GDB
public
public void
void ExportReplicaChanges(IGeoDataServer
ExportReplicaChanges(IGeoDataServer iGDS,
iGDS, String
String rName)
rName)
{{
IGDSExportOptions
IGDSExportOptions iExOptions
iExOptions == new
new GDSExportOptions();
GDSExportOptions();
iExOptions.ExportFormat
iExOptions.ExportFormat == esriGDSExportFormat.esriGDSExportFormatXml
esriGDSExportFormat.esriGDSExportFormatXml
iExOptions.Compressed
iExOptions.Compressed == true;
true;
iExOptions.BinaryGeometry
iExOptions.BinaryGeometry == true;
true;
esriGDSTransportType
esriGDSTransportType tType
tType == esriGDSTransportType.esriGDSTransportTypeUrl;
esriGDSTransportType.esriGDSTransportTypeUrl;
esriExportGenerationsOption
esriExportGenerationsOption gOption
gOption ==
esriExportGenerationsOption.esriExportGenerationAll;
esriExportGenerationsOption.esriExportGenerationAll;
IGDSData
IGDSData iGDSData
iGDSData ==
iGDS.ExportReplicaChanges(rName,
iGDS.ExportReplicaChanges(rName, iExOptions,
iExOptions, tType,
tType, gOption,
gOption,
false);
false); /*
/* swtich
swtich role
role to
to be
be aa receiver
receiver */
*/
System.Net.WebClient
System.Net.WebClient wc
wc == new
new System.Net.WebClient();
System.Net.WebClient();
wc.DownLoadFile(iGDSData.URL,
wc.DownLoadFile(iGDSData.URL, @“C:\delta.zip”);
@“C:\delta.zip”);
wc.Dispose();
wc.Dispose();
}}
Synchronizing Replicas (Importing Changes)
Replica changes can be imported from xml, fileGDB, or personal GDB
public
public void
void ImportReplicaChanges(IGeoDataServer
ImportReplicaChanges(IGeoDataServer iGDS,
iGDS, String
String rName)
rName)
{{
String
String fileName
fileName == new
new String(@”C:\delta.zip”);
String(@”C:\delta.zip”);
FileInfo
FileInfo fInfo
fInfo == new
new FileInfo(fileName);
FileInfo(fileName); int
int len
len == fInfo.Length;
fInfo.Length;
byte
byte []
[] bytes
bytes == new
new byte[len];
byte[len];
FileStream
FileStream fsfs == File.Open(fileName,
File.Open(fileName, FileMode.Open,
FileMode.Open, FileAccess.Read);
FileAccess.Read);
BinaryReader
BinaryReader rr == new
new BinaryReader(fs);
BinaryReader(fs);
r.Read(bytes,
r.Read(bytes, 0,
0, len);
len);
r.Close();
r.Close(); fs.Close();
fs.Close();
IGDSData
IGDSData iGDSData
iGDSData == new
new GDSDataClass();
GDSDataClass();
iGDSData.TransportType
iGDSData.TransportType == esriGDSTransportTypeEmbedded;
esriGDSTransportTypeEmbedded;
iGDSData.set_EmbeddedData(ref
iGDSData.set_EmbeddedData(ref bytes);
bytes);
esriReplicaInputSource
esriReplicaInputSource rSrc
rSrc == esriGDSReplicaImportSourceDeltaXmlFile;
esriGDSReplicaImportSourceDeltaXmlFile;
esriReplicaReconcilePolicyType
esriReplicaReconcilePolicyType recPolicy
recPolicy == esriReplicaDetectConflicts;
esriReplicaDetectConflicts;
bool
bool conflicts
conflicts == iGDS.ImportReplicaChanges(rSrc,
iGDS.ImportReplicaChanges(rSrc, recPolicy,
recPolicy,
true,
true, /*
/* column
column conflicts
conflicts detection
detection */
*/
iGDSData);
iGDSData);
}}
Synchronize Replicas – Replica Sync Events
Interface
Interface IWorkspaceReplicaSyncEvents
IWorkspaceReplicaSyncEvents :: IUnknown
IUnknown
{{
……
HRESLT
HRESLT BeforeSynchronizingDataChanges(IReplica*
BeforeSynchronizingDataChanges(IReplica* iTargetReplica,
iTargetReplica,
IUnknown*
IUnknown* iDeltaDataChanges)
iDeltaDataChanges)
HRESULT
HRESULT AfterSynchronizingDataChanges(IReplica*
AfterSynchronizingDataChanges(IReplica* iTargetReplica,
iTargetReplica,
IUnknown*
IUnknown* iDeltaDataChanges,
iDeltaDataChanges,
ITable*
ITable* iOIDMappingTable,
iOIDMappingTable,
ITable*
ITable* iChangesTable);
iChangesTable);
};
};
Fine Grained API: Inspecting Replica Changes
Developers may need to get the replica changes without exporting them
public
public ArrayList
ArrayList ReadReplicaChanges(IReplica
ReadReplicaChanges(IReplica iReplica,
iReplica, IWorkspaceName
IWorkspaceName iName)
iName)
{{
IReplicaDataChangeInit2
IReplicaDataChangeInit2 iInit
iInit == new
new ReplicationDataChangesClass();
ReplicationDataChangesClass();
esriExportGenerationsOption
esriExportGenerationsOption gOption
gOption ==
esriExportGenerationsOption.esriExportGenerationsNew;
esriExportGenerationsOption.esriExportGenerationsNew;
try
try {{
iInit.Init2(iReplica,
iInit.Init2(iReplica, iName,
iName, gOption);
gOption);
}}
catch
catch (COMException
(COMException e)
e) {…}
{…}
IDataChanges
IDataChanges iRDC
iRDC == iInit
iInit as
as IDataChanges;
IDataChanges;
IEnumModifiedClassInfo
IEnumModifiedClassInfo iMCInfos
iMCInfos == iRDC.GetModifiedClasses();
iRDC.GetModifiedClasses();
ArrayList
ArrayList al
al == new
new ArrayList();
ArrayList();
IModifiedClassInfo
IModifiedClassInfo iMCIiMCI == null
null ;;
while
while ((iMCI
((iMCI == iMCInfos.Next())
iMCInfos.Next()) !=
!= null)
null)
al.Add(mcInfo.Name);
al.Add(mcInfo.Name);
return
return al;
al;
}}
Synchronization Algorithm Internals
• Export only new changes if you know that the prior sent changes
were received by the target replica
public
public ArrayList
ArrayList GetRecommendedReplicasSyncOrder(IWorkspace
GetRecommendedReplicasSyncOrder(IWorkspace iWS)
iWS)
{{
IVersionedWorkspace3
IVersionedWorkspace3 iVWS
iVWS == iWS
iWS as
as IVersionedWorkspace3;
IVersionedWorkspace3;
IEnumBSTR
IEnumBSTR iRepNames
iRepNames == null;
null;
try
try {{
iRepNames
iRepNames == iVWS.RecommendedSyncOrder;
iVWS.RecommendedSyncOrder;
catch
catch {{
return
return null;
null;
}}
IWorkspaceReplicas
IWorkspaceReplicas iWSReplicas
iWSReplicas == iWS
iWS as
as IWorkspaceReplicas;
IWorkspaceReplicas;
ArrayList
ArrayList al
al == new
new ArrayList();
ArrayList();
string
string rName;
rName;
while
while ((rName
((rName == iRepNames.Next())
iRepNames.Next()) !=
!= null)
null) {{
IReplica
IReplica iReplica
iReplica == iWSReplicas.get_ReplicaByName(rName);
iWSReplicas.get_ReplicaByName(rName);
al.Add(iReplica);
al.Add(iReplica);
}}
return
return al;
al;
}}
Fine Grained API: Version Differences
Developers may need to import version differences to the replica version
public
public void
void ExportVersionChanges(IWorkspaceName
ExportVersionChanges(IWorkspaceName iSRC,
iSRC, IWorkspaceName
IWorkspaceName iTrg)
iTrg)
{{
IVersionDataChangesInit
IVersionDataChangesInit iVInit
iVInit == new
new VersionDataChangesClass();
VersionDataChangesClass();
try
try {{
iVInit.Init(iSRC,
iVInit.Init(iSRC, iTrg);
iTrg);
}}
catch
catch (COMException
(COMException e)
e) {…}
{…}
IExportDataChanges
IExportDataChanges iEDC
iEDC == new
new DataChangesExporter();
DataChangesExporter();
esriExportDataChangesOption
esriExportDataChangesOption exOption
exOption ==
esriExportDataChangesOption.esriExportToXML;
esriExportDataChangesOption.esriExportToXML;
try
try {{
iEDC.ExportChanges(@”C:\VersionDiff.xml”,
iEDC.ExportChanges(@”C:\VersionDiff.xml”,
exOption,
exOption,
iVInit
iVInit as
as IDataChanges,
IDataChanges,
false);
false); /*
/* overwrite
overwrite if
if exists
exists */
*/
}}
catch
catch (COMException
(COMException ce)
ce)
{{ …
… }}
}}
Fine Grained API: Tables Differences
public
public void
void ExportTableChanges(ITable
ExportTableChanges(ITable iInserts,
iInserts, ITable
ITable iUpdates,
iUpdates, IStringArray
IStringArray
iDeletes)
iDeletes)
{{
ITablesDataChanges
ITablesDataChanges iTDCs
iTDCs == new
new TablesDataChangesClass();
TablesDataChangesClass();
try
try {{
ITableDataChange
ITableDataChange iTDC
iTDC == new
new TableDataChange();
TableDataChange();
iTDC.Init(“Parcel”,
iTDC.Init(“Parcel”, iInserts,
iInserts, iUpdates,
iUpdates, null);
null);
iTDC.SetDeletedIDs(null,
iTDC.SetDeletedIDs(null, iDeletes);
iDeletes);
iTDCs.Add(ipTDC);
iTDCs.Add(ipTDC);
}}
catch
catch (COMException
(COMException e)
e) {…}
{…}
IExportDataChanges
IExportDataChanges iEDC
iEDC == new
new DataChangesExporter();
DataChangesExporter();
try
try {{
iEDC.ExportChanges(@”C:\TableDiffs.xml”,
iEDC.ExportChanges(@”C:\TableDiffs.xml”,
esriExportDataChangesOption.esriExportToXML,
esriExportDataChangesOption.esriExportToXML,
iTDCs
iTDCs as
as IDataChanges,
IDataChanges,
false);
false); /*
/* overwrite
overwrite if
if exists
exists */
*/
}}
catch
catch (COMException
(COMException ce)
ce)
{{ …
… }}
}}
Fine Grained API: Importing Differences
Developers may need to import version/Tables differences to the replica
public
public void
void ImportChanges(IWorkspaceName
ImportChanges(IWorkspaceName iReplicaWorkspace)
iReplicaWorkspace)
{{
IDeltaDataChangesInit
IDeltaDataChangesInit iInit
iInit == new
new DeltaDataChangesClass();
DeltaDataChangesClass();
try
try {{
iInit.Init(@”C:\diffs.xml”,
iInit.Init(@”C:\diffs.xml”, esriExportToXML);
esriExportToXML);
}}
catch
catch (COMException
(COMException e)
e) {…}
{…}
IImportDataChanges2
IImportDataChanges2 iImportDC
iImportDC == new
new DataChangesImporterClass();
DataChangesImporterClass();
try
try {{
bool
bool conflicts
conflicts == iImportDC.ImportDataChanges2(
iImportDC.ImportDataChanges2(
iRepWorkspace,
iRepWorkspace,
iInit
iInit as
as IDeltaDataChanges,
IDeltaDataChanges,
true,
true, /*/* reconcile
reconcile with
with the
the parent
parent version
version */
*/
esriReplicaReconcilePolicyType.esriReplicaDetectConflicts,
esriReplicaReconcilePolicyType.esriReplicaDetectConflicts,
true,
true, /*
/* column
column level
level conflicts
conflicts detection
detection */
*/
true);
true); /*
/* create
create oid
oid mapping
mapping table
table */
*/
}}
catch
catch (COMException
(COMException ce)
ce) {…}
{…}
}}
Enhancements – User Defined GlobalIDs
• Create Replica
External System
Create 1 way convert data
Parent replica Child (Interop ext)
Geodatabase Geodatabase
• Synchronize Replica
External System
Synchronize convert data
Changes (Interop ext)
Parent Child
Geodatabase Geodatabase
Check-out replication workflow
V V
Enterprise
Geodatabase