2

I'm trying to create a checkout replica of some feature classes from an ArcSDE geodatabase to a file geodatabase using ArcObjects.

I'm trying to follow this: How to create a replica in a connected environment, but I'm getting an ArgumentException when calling CreateReplica with the following message: "The workspace is not connected".

Also, I can access the workspaces I'm using without any problems in other parts of the code.

I haven't been able to find the cause of the problem yet, could anyone help me with this?

Here are the relevant parts in my code:

//PS: _workspace is a private attribute
private void replicateData(string path, string name, IGeometry area)
    {
        IWorkspace localWorkspace = CreateFileGDB(path, name);
        if (localWorkspace == null) return;


        IGeoDataServer parentGds = InitGeoDataServer(_workspace),
                       childGds = InitGeoDataServer(localWorkspace);

        string replicaName = "replica_" + (DateTime.UtcNow - DateTime.MinValue).ToString().Replace(",","");

        CreateFeatureDatasetReplica(parentGds, childGds, replicaName, esriReplicaAccessType.esriReplicaAccessNone, 
                                    _workspace, area, false, false);
    }

//Creates a file GDB, opens its workspace and returns it
public IWorkspace CreateFileGDB(string path, string name)
    {
        if (Directory.Exists(path + name))  
                Directory.Delete(path + name, true);

        var workspaceFactory = new FileGDBWorkspaceFactoryClass() as WorkspaceFactory;
        IWorkspaceName workspaceName = workspaceFactory.Create(path, name, null, 0);

        return (IWorkspace)(workspaceName as IName).Open();


//Opens a GeoDataServer from a workspace 
public static IGeoDataServer IniciaGeoDataServer(IWorkspace workspace)
    {
        IGeoDataServer geoDataServer = new GeoDataServerClass();
        IGeoDataServerInit geoDataServerInit = (IGeoDataServerInit)geoDataServer;

        geoDataServerInit.InitWithWorkspace(workspace);
        return geoDataServer;
    }

//Function to create the replica, based on the example linked above
public void CreateFeatureDatasetReplica(IGeoDataServer parentGDS, IGeoDataServer
        childGDS, String replicaName, esriReplicaAccessType accessType, IWorkspace parentWorkspace,
        IGeometry geometry, Boolean registerOnly, Boolean useArchiving)
    {
        IEnumDataset datasets = parentWorkspace.get_Datasets(esriDatasetType.esriDTFeatureClass);
        IGPReplicaDatasets gpReplicaDatasets = new GPReplicaDatasetsClass();
        IDataset dataset;
        while ((dataset = datasets.Next()) != null)
        {
            //temporary workaround to not include a view that is on the feature classes :^)
            if (dataset.Name.Contains("VW_")) continue;

            IGPReplicaDataset gpReplicaDataset = new GPReplicaDatasetClass();
            gpReplicaDataset.DatasetType = dataset.Type;
            gpReplicaDataset.Name = dataset.Name;
            gpReplicaDatasets.Add(gpReplicaDataset);

        }

        IGPReplicaDatasets gpReplicaDatasetsExpand = parentGDS.ExpandReplicaDatasets(gpReplicaDatasets);

        IGPReplicaDescription gpReplicaDesc = new GPReplicaDescriptionClass();
        gpReplicaDesc.ReplicaDatasets = gpReplicaDatasetsExpand;
        gpReplicaDesc.ModelType = esriReplicaModelType.esriModelTypeFullGeodatabase;
        gpReplicaDesc.SingleGeneration = (accessType ==
            esriReplicaAccessType.esriReplicaAccessNone);
        gpReplicaDesc.QueryGeometry = geometry;
        gpReplicaDesc.SpatialRelation =
            esriSpatialRelEnum.esriSpatialRelIndexIntersects;

        IGPReplicaOptions2 replicaOptions = new GPReplicaOptionsClass();
        replicaOptions.AccessType = accessType;
        replicaOptions.ChildReconcilePolicy =
            esriReplicaReconcilePolicyType.esriReplicaResolveConflictsNone;
        replicaOptions.ParentReconcilePolicy =
            esriReplicaReconcilePolicyType.esriReplicaResolveConflictsNone;
        replicaOptions.IsChildFirstSender = true;
        replicaOptions.RegisterReplicaOnly = registerOnly;
        replicaOptions.UseArchiving = useArchiving;

        IReplicationAgent replicationAgent = new ReplicationAgentClass();
        replicationAgent.CreateReplica("", parentGDS, childGDS, null,
            gpReplicaDesc, replicaOptions);
    }

(How to initialize a GeoDataServer for reference on opening the GeoDataServer function)

1

I believe the replica name has to be a unique string.

Your code is passing a null.

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.