ArcEngine实现MDB格式数据转GDB格式有多种方式,可以创建GDB数据后,读取MDB,利用gp工具中featureClassToFeatureClass的逐个图层进行复制,但这种方式对于图层较多的数据来讲,转换速度较慢,而且实践后发现制图表达信息会丢失。经研究,发现gp工具中的copy工具可以很方便的实现数据类型转换。代码如下:
// mdb转gdb
public void ConvertMDBToGDB(string mdbPath, string gdbPath)
{
IWorkspaceFactory sourceWsF = new AccessWorkspaceFactoryClass();
IWorkspace sourceWs = sourceWsF.OpenFromFile(mdbPath, 0);
IWorkspaceFactory targetWsF = new FileGDBWorkspaceFactoryClass();
IWorkspaceName workspaceName = targetWsF.Create(Path.GetDirectoryName(gdbPath), Path.GetFileName(gdbPath), null, 0);
Geoprocessor geoprocessor = new Geoprocessor();
geoprocessor.OverwriteOutput = true;
var sourceFcs = GeoHelper.GetDatasets(sourceWs).Distinct().ToList();
foreach (var fn in sourceFcs)
{
ESRI.ArcGIS.DataManagementTools.Copy copyTool = new ESRI.ArcGIS.DataManagementTools.Copy();
copyTool.in_data = string.Format("{0}\\{1}", mdbPath, fn); //两项参数均为“路径/数据集名”
copyTool.out_data = string.Format("{0}\\{1}", gdbPath, fn);
try
{
geoprocessor.Execute(copyTool, null);
Console.WriteLine("数据集 {0} 复制成功!", fn);
}
catch (Exception ex)
{
Console.WriteLine("{0}", ex.Message);
for (int k = 0; k < geoprocessor.MessageCount; k++)
Console.WriteLine("{0}", geoprocessor.GetMessage(k));
}
}
}
//获取所有要素图层名
public static List<string> GetDatasets(IWorkspace ws, bool isAddSetName = false)
{
var lns = new List<string>();
var datasets = ws.Datasets[esriDatasetType.esriDTAny];
IDataset dataset;
while ((dataset = datasets.Next()) != null)
{
lns.Add(dataset.Name);
}
return lns;
}
类似的,GDB转MDB也可以参考上述方法。