Всем привет!
По теме копирования данных из одной БГД в другую нашёл в хелпе хорошую статью "Copying and pasting geodatabase datasets". Реализовал копирование, результат такой:
1) копирование набора целиком - ок
2) копирование класса из корня - ок
3) копирование класса из набора - проблема: во второй БГД класс оказывается в корне. В связи с этим вопросы:
Как заставить Trasfer копировать класс в соответствующий набор, который УЖЕ имеется в базе-приемнике? А если его нет - создать.
Вот чего имею сейчас:
// Get the first GDB.
IGPValue parameterValue = m_GPUtilities.UnpackGPValue(paramvalues.get_Element(_InWorkspaceID));
IDataset workspace_par = m_GPUtilities.OpenDataset(parameterValue);
// Get the second GDB.
parameterValue = m_GPUtilities.UnpackGPValue(paramvalues.get_Element(_InChildID));
IDataset workspace_ch = m_GPUtilities.OpenDataset(parameterValue);
// for transfer classes
IWorkspaceName sourceWorkspaceName = (IWorkspaceName)workspace_par.FullName;
IWorkspaceName targetWorkspaceName = (IWorkspaceName)workspace_ch.FullName;
IName targetName = (IName)targetWorkspaceName;
// Create an enumerator for source datasets.
IEnumName sourceEnumName = new NamesEnumeratorClass();
IEnumNameEdit sourceEnumNameEdit = (IEnumNameEdit)sourceEnumName;
// New feature class or table
parameterValue = m_GPUtilities.UnpackGPValue(paramvalues.get_Element(_InFeaturesID));
IGPMultiValue multiValue = parameterValue as IGPMultiValue;
for (int i = 0; i < multiValue.Count; i++)
{
IFeatureClass fc; IQueryFilter qf;
m_GPUtilities.DecodeFeatureLayer(multiValue.Value, out fc, out qf);
IDatasetName sourceDatasetName = (IDatasetName)(fc as IDataset).FullName;
IName sourceName = (IName)sourceDatasetName;
// Add the name object for the source class to the enumerator.
sourceEnumNameEdit.Add(sourceName);
}
// Create a GeoDBDataTransfer object and a null name mapping enumerator.
IGeoDBDataTransfer geoDBDataTransfer = new GeoDBDataTransferClass();
IEnumNameMapping enumNameMapping = null;
// Use the data transfer object to create a name mapping enumerator.
Boolean conflictsFound = geoDBDataTransfer.GenerateNameMapping(sourceEnumName, targetName, out enumNameMapping);
enumNameMapping.Reset();
if (conflictsFound)
{ ...
}
// Start the transfer.
geoDBDataTransfer.Transfer(enumNameMapping, targetName);