using ESRI.ArcGIS.ADF; using ESRI.ArcGIS.Geodatabase; using ESRI.ArcGIS.Geometry; using KGIS.Framework.AE; using KGIS.Framework.AE.Enum; using KGIS.Framework.OpenData.Control; using KGIS.Framework.OpenData.Filter; using KGIS.Framework.OpenData.InterFace; using KGIS.Framework.Utils; using KGIS.Framework.Utils.Helper; using Kingo.OpenData.Filter; using System; using System.Collections.Generic; using System.IO; using System.Runtime.InteropServices; using System.Windows; using System.Windows.Forms; using KUI.Windows; using Kingo.Plugin.DataLoad.Helper; namespace Kingo.Plugin.DataLoad.View { /// /// 数据转化 的交互逻辑 /// public partial class FrmDataConversion : BaseWindow { /// /// 源数据类型 /// private string ImportDataType; public FrmDataConversion() { InitializeComponent(); } private void BtnSelectedYJGD_Click(object sender, RoutedEventArgs e) { try { using (ComReleaser com = new ComReleaser()) { OpenDataDialog pDialog = new OpenDataDialog(); ISpatialDataObjectFilter pOFilter = new FilterGeoDatabasePersonal(); pDialog.AddFilter(pOFilter, true); pOFilter = new FilterGeoDatabaseFile(); pDialog.AddFilter(pOFilter, true); pDialog.AllowMultiSelect = false; pDialog.Title = "选择MDB/GDB数据"; pDialog.RestoreLocation = true; pDialog.StartLocation = pDialog.FinalLocation; DialogResult dialogResult = pDialog.ShowDialog(); if (dialogResult == System.Windows.Forms.DialogResult.OK && pDialog.Selection.Count != 0) { ImportDataType = System.IO.Path.GetExtension(pDialog.FinalLocation).ToUpper().Replace('.', ' ').TrimStart(); if (string.IsNullOrWhiteSpace(ImportDataType) || (ImportDataType != "MDB" && ImportDataType != "GDB")) { MessageHelper.Show("选择的数据路径有误,请根据过滤条件,重新选择数据库!!"); return; } else if ("MDB,GDB".Contains(ImportDataType)) { rdG.IsChecked = ImportDataType != "GDB"; rdG.IsEnabled = ImportDataType != "GDB"; rdM.IsChecked = ImportDataType != "MDB"; rdM.IsEnabled = ImportDataType != "MDB"; } cobYJGDTextEdit.Text = pDialog.FinalLocation; } } } catch (Exception ex) { LogAPI.Debug("选择基础数据库失败:" + ex); MessageHelper.Show("选择基础数据库失败:" + ex.Message); } } private void BtnGDBBaseData_Click(object sender, RoutedEventArgs e) { FolderBrowserDialog dialog = new FolderBrowserDialog(); DialogResult result = dialog.ShowDialog(); if (result == System.Windows.Forms.DialogResult.OK) cobTextEdit.Text = dialog.SelectedPath; } private void BtnLoad_Click(object sender, RoutedEventArgs e) { try { #region 数据转化前置条件 if (!File.Exists(cobYJGDTextEdit.Text) && ImportDataType == "MDB") { MessageHelper.Show("请先选择源数据库!"); return; } if (!Directory.Exists(cobYJGDTextEdit.Text) && ImportDataType == "GDB") { MessageHelper.Show("请先选择源数据库!"); return; } if (string.IsNullOrWhiteSpace(cobTextEdit.Text)) { MessageHelper.Show("请选择输出数据库路径!"); return; } if (rdG.IsChecked == false && rdM.IsChecked == false && rdS.IsChecked == false) { MessageHelper.Show("请选择输出的数据类型!"); return; } #endregion this.ShowLoading("正在转化数据......", 0, 0); System.Threading.Thread.Sleep(1000); if (ImportDataType == "MDB" && rdG.IsChecked == true) { this.UpdateMsg("正在进行MDB转化为GDB数据中.........."); MDBConversionGDB(cobYJGDTextEdit.Text, cobTextEdit.Text); } else if (ImportDataType == "MDB" && rdS.IsChecked == true) { this.UpdateMsg("正在进行MDB转化为Shape数据中........."); MGDBConversionShape(cobYJGDTextEdit.Text, cobTextEdit.Text, ImportDataType); } else if (ImportDataType == "GDB" && rdM.IsChecked == true) { this.UpdateMsg("正在进行GDB转化为MDB数据中.........."); GDBConversionMDB(cobYJGDTextEdit.Text, cobTextEdit.Text); } else if (ImportDataType == "GDB" && rdS.IsChecked == true) { this.UpdateMsg("正在进行GDB转化为Shape数据中........."); MGDBConversionShape(cobYJGDTextEdit.Text, cobTextEdit.Text, ImportDataType); } this.CloseLoading(); MessageHelper.ShowTips("转化完成!"); } catch (Exception ex) { this.CloseLoading(); MessageHelper.ShowTips("数据转化异常" + ex.Message); LogAPI.Debug("数据转化异常" + ex.Message); } finally { this.CloseLoading(); } } /// /// MDB 转 GDB /// /// 源路径 /// 输出路径 private void MDBConversionGDB(string S_MDBPath, string E_GDBPath) { WorkspaceAPI s_WsAPI = null; WorkspaceAPI t_WsAPI = null; IEnumDataset pEnumDataset = null; try { s_WsAPI = new WorkspaceAPI(S_MDBPath, WorkspaceTypeEnum.MDBFile, true); string MDBName = System.IO.Path.GetFileNameWithoutExtension(S_MDBPath); string GDBTempPath = PluginServiceInterface.CommonHelper.CreateTempGDB(MDBName, E_GDBPath); t_WsAPI = new WorkspaceAPI(GDBTempPath, WorkspaceTypeEnum.GDBFile, true); pEnumDataset = s_WsAPI.CurrentWorkspace.Datasets[esriDatasetType.esriDTFeatureDataset]; if (pEnumDataset != null) { pEnumDataset.Reset(); IDataset pDataset = null; //如果数据集是IFeatureDataset,则遍历它下面的子类 while ((pDataset = pEnumDataset.Next()) != null) { IDataset newDataset = null; newDataset = DLAECommonHelper.CreateFeatureDataset(t_WsAPI); if (newDataset == null) continue; List listFeatureClass = new List(); List listFeatureClassNameList = new List(); IEnumDataset ed = pDataset.Subsets; if (ed != null) { IDataset dataset = ed.Next(); while (dataset != null) { if ((dataset as IFeatureClass) != null) { string featureClassName = dataset.BrowseName; if (!string.IsNullOrWhiteSpace(featureClassName) && !listFeatureClass.Contains(featureClassName)) { listFeatureClass.Add(System.IO.Path.Combine(pDataset.Workspace.PathName.ToString(), pDataset.BrowseName, featureClassName)); listFeatureClassNameList.Add(featureClassName); } } Marshal.FinalReleaseComObject(dataset); dataset = ed.Next(); } } if (listFeatureClass.Count > 0) InsertGDBFeatureClass(cobYJGDTextEdit.Text, listFeatureClassNameList, GDBTempPath, newDataset.BrowseName); if (newDataset != null) Marshal.FinalReleaseComObject(newDataset); } //若不存在数据集仅仅为要素类 List featureClasses = s_WsAPI.GetAllFeatureClass(esriDatasetType.esriDTFeatureClass); List FeatureClassNameList = new List(); foreach (IFeatureClass item in featureClasses) { if (!t_WsAPI.ExistFeatureClass((item as IDataset).Name) && !FeatureClassNameList.Contains((item as IDataset).Name)) { FeatureClassNameList.Add((item as IDataset).Name); IFeatureClassAPI featureTemp = s_WsAPI.OpenFeatureClass2((item as IDataset).Name); if (featureTemp == null) continue; IFeatureClassAPI TempFL = t_WsAPI.CreateFeatureClass((item as IDataset).Name, (featureTemp.FeatureClass as IGeoDataset).SpatialReference, featureTemp.FeatureClass.Fields); featureTemp.FcToFc(TempFL.FeatureClass, null, true); featureTemp?.CloseFeatureClass(); TempFL?.CloseFeatureClass(); } } } } catch (Exception ex) { throw ex; } finally { t_WsAPI?.CloseWorkspace(); s_WsAPI?.CloseWorkspace(); if (pEnumDataset != null) Marshal.ReleaseComObject(pEnumDataset); } } private void GDBConversionMDB(string S_GDBFullPath, string E_MDBFullPath) { WorkspaceAPI t_WsAPI = null; WorkspaceAPI s_WsAPI = null; IEnumDataset pEnumDataset = null; try { s_WsAPI = new WorkspaceAPI(S_GDBFullPath, WorkspaceTypeEnum.GDBFile, true); string GDBName = System.IO.Path.GetFileNameWithoutExtension(S_GDBFullPath); //创建mdb string temp = SysAppPath.GetTemplatePath() + "Temp.mdb"; E_MDBFullPath = System.IO.Path.Combine(E_MDBFullPath, GDBName + ".mdb"); if (File.Exists(temp)) File.Copy(temp, E_MDBFullPath, true); t_WsAPI = new WorkspaceAPI(E_MDBFullPath, WorkspaceTypeEnum.MDBFile, true); pEnumDataset = s_WsAPI.CurrentWorkspace.Datasets[esriDatasetType.esriDTFeatureDataset]; if (pEnumDataset != null) { pEnumDataset.Reset(); IDataset pDataset = null; //如果数据集是IFeatureDataset,则遍历它下面的子类 while ((pDataset = pEnumDataset.Next()) != null) { IDataset newDataset = null; newDataset = DLAECommonHelper.CreateFeatureDataset(t_WsAPI); if (newDataset == null) continue; List listFeatureClass = new List(); List listFeatureClassNameList = new List(); IEnumDataset ed = pDataset.Subsets; if (ed != null) { IDataset dataset = ed.Next(); while (dataset != null) { if ((dataset as IFeatureClass) != null) { string featureClassName = dataset.BrowseName; if (!string.IsNullOrWhiteSpace(featureClassName) && !listFeatureClass.Contains(featureClassName)) { listFeatureClass.Add(System.IO.Path.Combine(pDataset.Workspace.PathName.ToString(), pDataset.BrowseName, featureClassName)); listFeatureClassNameList.Add(featureClassName); } } Marshal.FinalReleaseComObject(dataset); dataset = ed.Next(); } } if (listFeatureClass.Count > 0) InsertMDBFeatureClass(S_GDBFullPath, listFeatureClassNameList, E_MDBFullPath, newDataset.BrowseName, null); if (newDataset != null) Marshal.FinalReleaseComObject(newDataset); } } if (t_WsAPI.ExistFeatureClass("MJHZJCTJB_YJJBNTTB")) t_WsAPI.DeleteFeatureClass("MJHZJCTJB_YJJBNTTB");//删除多余的表结构数据 } catch (Exception ex) { LogAPI.Debug(ex.Message); } finally { t_WsAPI?.CloseWorkspace(); s_WsAPI?.CloseWorkspace(); if (pEnumDataset != null) Marshal.ReleaseComObject(pEnumDataset); } } private void MGDBConversionShape(string S_M_GDBPath, string E_ShapePath, string DataType) { WorkspaceAPI s_WsAPI = null; IEnumDataset pEnumDataset = null; IWorkspaceFactory workFactory = null; IWorkspace pWorkspace = null; IWorkspaceAPI workspaceAPI = null; try { if (DataType == "MDB") { s_WsAPI = new WorkspaceAPI(S_M_GDBPath, WorkspaceTypeEnum.MDBFile, true); } else if (DataType == "GDB") { s_WsAPI = new WorkspaceAPI(S_M_GDBPath, WorkspaceTypeEnum.GDBFile, true); } string GDBName = System.IO.Path.GetFileNameWithoutExtension(S_M_GDBPath); E_ShapePath = System.IO.Path.Combine(E_ShapePath, GDBName); if (!Directory.Exists(E_ShapePath)) Directory.CreateDirectory(E_ShapePath); //PluginServiceInterface.CommonHelper.DelectDir(E_ShapePath); pEnumDataset = s_WsAPI.CurrentWorkspace.Datasets[esriDatasetType.esriDTFeatureDataset]; if (pEnumDataset != null) { pEnumDataset.Reset(); IDataset pDataset = null; //如果数据集是IFeatureDataset,则遍历它下面的子类 while ((pDataset = pEnumDataset.Next()) != null) { IEnumDataset ed = pDataset.Subsets; if (ed != null) { IDataset dataset = ed.Next(); while (dataset != null) { if ((dataset as IFeatureClass) != null) { string featureClassName = dataset.BrowseName; DLAECommonHelper.DeleteShp((dataset as IFeatureClass).AliasName, E_ShapePath); DLAECommonHelper.ExportFeaturesToShp(dataset as IFeatureClass, null, E_ShapePath, featureClassName); } Marshal.FinalReleaseComObject(dataset); dataset = ed.Next(); } } } //若不存在数据集仅仅为要素类 List featureClasses = s_WsAPI.GetAllFeatureClass(esriDatasetType.esriDTFeatureClass); workFactory = new ESRI.ArcGIS.DataSourcesFile.ShapefileWorkspaceFactoryClass(); pWorkspace = workFactory.OpenFromFile(E_ShapePath, 0); workspaceAPI = new WorkspaceAPI(pWorkspace); foreach (IFeatureClass item in featureClasses) { if (!workspaceAPI.ExistFeatureClass((item as IDataset).Name)) { IFeatureClassAPI featureTemp = s_WsAPI.OpenFeatureClass2((item as IDataset).Name); if (featureTemp == null) continue; DLAECommonHelper.DeleteShp(item.AliasName, E_ShapePath); IFeatureClassAPI TempFL = workspaceAPI.CreateFeatureClass((item as IDataset).Name, (featureTemp.FeatureClass as IGeoDataset).SpatialReference, featureTemp.FeatureClass.Fields); featureTemp.FcToFc(TempFL.FeatureClass, null, true); featureTemp?.CloseFeatureClass(); TempFL?.CloseFeatureClass(); } } } } catch (Exception ex) { throw ex; } finally { if (pEnumDataset != null) Marshal.ReleaseComObject(pEnumDataset); if (pWorkspace != null) Marshal.ReleaseComObject(pWorkspace); s_WsAPI?.CloseWorkspace(); workspaceAPI?.CloseWorkspace(); } } /// /// 从MDB中拷贝要素类插入到GDB /// /// GDB地址 /// GDB中要拷贝的要素类名称列表 /// 要插入到的MDB的地址路径 /// 输出的数据集的名字 public void InsertGDBFeatureClass(string sFromGDBPath, List iFeatureClassNameList, string iOutPutMDBPath, string sOutPutDataSetName) { IFeatureWorkspace fws_gdb = null; WorkspaceAPI wsapi_gdb = null; IFeatureClassAPI fcapi_gdb = null; IFeatureClass fc_gdb = null; IFeatureClass newFeatureClass = null; IFeatureWorkspace fws_mdb = null; int iAddSuccessCount = 0; int iAddFailCount = 0; int iFCToFCType = 0;//fc2fc类型(0不涉及到数据集的方式 1涉及到数据集的方式) try { iFCToFCType = string.IsNullOrWhiteSpace(sOutPutDataSetName) == true ? 0 : 1; if (string.IsNullOrWhiteSpace(sFromGDBPath) == true) { LogAPI.Debug("从MDB中拷贝要素类插入到GDB中 时失败,原因: MDB地址 为空 ; "); throw new Exception("GDB地址 不能为空"); } if (iFeatureClassNameList == null || iFeatureClassNameList.Count <= 0) { LogAPI.Debug("从MDB中拷贝要素类插入到GDB中 时失败,原因: MDB中要拷贝的要素类名称列表 为空 ; "); throw new Exception("要转换的要素类 不能为空"); } wsapi_gdb = new WorkspaceAPI(sFromGDBPath, WorkspaceTypeEnum.MDBFile, true); fws_gdb = wsapi_gdb.CurrentWorkspace as IFeatureWorkspace; IWorkspace ws_gdb = fws_gdb as IWorkspace; WorkspaceAPI wsapi_mdb = new WorkspaceAPI(iOutPutMDBPath, WorkspaceTypeEnum.GDBFile, true); fws_mdb = wsapi_mdb.CurrentWorkspace as IFeatureWorkspace; for (int i = 0; i < iFeatureClassNameList.Count; i++) { fcapi_gdb = wsapi_gdb.OpenFeatureClass(iFeatureClassNameList[i]); if (fcapi_gdb != null) { fc_gdb = fcapi_gdb.FeatureClass; IGeoDataset geoDataset = fc_gdb as IGeoDataset; bool bFC2FCResult_Temp; if (iFCToFCType == 1)//fc2fc类型:1涉及到数据集的方式; { bFC2FCResult_Temp = MDBFc2FcGDB(fc_gdb, fws_mdb as IWorkspace, iFeatureClassNameList[i], sOutPutDataSetName, null); #region 处理坐标参考系 IFeatureDataset dataSet = fws_mdb.OpenFeatureDataset(sOutPutDataSetName); ISpatialReference sp = geoDataset.SpatialReference; IGeoDataset pGeoDataset = dataSet as IGeoDataset; IGeoDatasetSchemaEdit pGeoDatasetSchemaEdit = pGeoDataset as IGeoDatasetSchemaEdit; if (pGeoDatasetSchemaEdit.CanAlterSpatialReference == true) pGeoDatasetSchemaEdit.AlterSpatialReference(sp); Marshal.ReleaseComObject(dataSet); Marshal.ReleaseComObject(pGeoDataset); #endregion } else { bFC2FCResult_Temp = MDBFc2FcGDB(fc_gdb, fws_mdb as IWorkspace, iFeatureClassNameList[i]); #region 处理坐标参考系 newFeatureClass = fws_mdb.OpenFeatureClass(iFeatureClassNameList[i]); IGeoDataset gdataset = newFeatureClass as IGeoDataset; if (gdataset != null) { IGeoDatasetSchemaEdit pGeoDatasetSchemaEdit = gdataset as IGeoDatasetSchemaEdit; if (pGeoDatasetSchemaEdit.CanAlterSpatialReference == true) pGeoDatasetSchemaEdit.AlterSpatialReference(geoDataset.SpatialReference); } #endregion Marshal.ReleaseComObject(gdataset); } Marshal.ReleaseComObject(geoDataset); if (bFC2FCResult_Temp == true) iAddSuccessCount += 1; else iAddFailCount += 1; } } return; } catch (Exception ex) { LogAPI.Debug("将要素类拷贝至GDB中失败,异常原因: " + ex + " ; "); LogAPI.DebugRunLog(ex, "将要素类拷贝至GDB中失败,异常原因: ", "InsertGDBFeatureClass"); throw new Exception("GDB转化成MDB地址失败"); } finally { if (fws_gdb != null) Marshal.ReleaseComObject(fws_gdb); wsapi_gdb?.CloseWorkspace(); fcapi_gdb?.CloseFeatureClass(); if (fc_gdb != null) Marshal.ReleaseComObject(fc_gdb); if (fws_mdb != null) { Marshal.ReleaseComObject(fws_mdb); fws_mdb = null; } if (newFeatureClass != null) Marshal.ReleaseComObject(newFeatureClass); } } /// /// 从GDB中拷贝要素类插入到MDB中 2020-6-1 沈超 /// /// GDB地址 /// GDB中要拷贝的要素类名称列表 /// 要插入到的MDB的地址路径 /// 输出的数据集的名字 /// 输出坐标参考:如果不是要素集下的图层,则要赋坐标参考 public void InsertMDBFeatureClass(string sFromGDBPath, List iFeatureClassNameList, string iOutPutMDBPath, string sOutPutDataSetName, string sSpatialReference = null) { IFeatureWorkspace fws_gdb = null; IWorkspace ws_gdb = null; WorkspaceAPI wsapi_gdb = null; IFeatureClassAPI fcapi_gdb = null; IFeatureClass fc_gdb = null; IFeatureClass newFeatureClass = null; IFeatureWorkspace fws_mdb = null; int iAddSuccessCount = 0; int iAddFailCount = 0; bool bFC2FCResult_Temp = false; int iFCToFCType = 0;//fc2fc类型(0不涉及到数据集的方式 1涉及到数据集的方式) try { iFCToFCType = string.IsNullOrWhiteSpace(sOutPutDataSetName) == true ? 0 : 1; if (string.IsNullOrWhiteSpace(sFromGDBPath) == true) { LogAPI.Debug("从GDB中拷贝要素类插入到MDB中 时失败,原因: GDB地址 为空 ; "); throw new Exception("GDB地址 不能为空"); } if (iFeatureClassNameList == null || iFeatureClassNameList.Count <= 0) { LogAPI.Debug("从GDB中拷贝要素类插入到MDB中 时失败,原因: GDB中要拷贝的要素类名称列表 为空 ; "); throw new Exception("要转换的要素类 不能为空"); } WorkspaceAPI wsapi_MDB = new WorkspaceAPI(iOutPutMDBPath, WorkspaceTypeEnum.MDBFile, true); fws_mdb = wsapi_MDB.CurrentWorkspace as IFeatureWorkspace; if (fws_mdb == null) throw new Exception("MDB地址 不能为空"); wsapi_gdb = new WorkspaceAPI(sFromGDBPath, WorkspaceTypeEnum.GDBFile, true); fws_gdb = wsapi_gdb.CurrentWorkspace as IFeatureWorkspace; ws_gdb = fws_gdb as IWorkspace; for (int i = 0; i < iFeatureClassNameList.Count; i++) { fcapi_gdb = wsapi_gdb.OpenFeatureClass(iFeatureClassNameList[i]); if (fcapi_gdb != null) { fc_gdb = fcapi_gdb.FeatureClass; IGeoDataset geoDataset = fc_gdb as IGeoDataset; if (iFCToFCType == 1)//fc2fc类型:1涉及到数据集的方式; { bFC2FCResult_Temp = GDBFc2FcMDB(fc_gdb, fws_mdb as IWorkspace, iFeatureClassNameList[i], sOutPutDataSetName, null); #region 处理坐标参考系 IFeatureDataset dataSet = fws_mdb.OpenFeatureDataset(sOutPutDataSetName); ISpatialReference sp = geoDataset.SpatialReference; IGeoDataset pGeoDataset = dataSet as IGeoDataset; IGeoDatasetSchemaEdit pGeoDatasetSchemaEdit = pGeoDataset as IGeoDatasetSchemaEdit; if (pGeoDatasetSchemaEdit.CanAlterSpatialReference == true) pGeoDatasetSchemaEdit.AlterSpatialReference(sp); Marshal.ReleaseComObject(dataSet); Marshal.ReleaseComObject(pGeoDataset); #endregion } else//fc2fc类型:0不涉及到数据集的方式; { bFC2FCResult_Temp = GDBFc2FcMDB(fc_gdb, fws_mdb as IWorkspace, iFeatureClassNameList[i], null); #region 处理坐标参考系 newFeatureClass = fws_mdb.OpenFeatureClass(iFeatureClassNameList[i]); IGeoDataset gdataset = newFeatureClass as IGeoDataset; if (gdataset != null) { IGeoDatasetSchemaEdit pGeoDatasetSchemaEdit = gdataset as IGeoDatasetSchemaEdit; if (pGeoDatasetSchemaEdit.CanAlterSpatialReference == true) pGeoDatasetSchemaEdit.AlterSpatialReference(geoDataset.SpatialReference); } #endregion Marshal.ReleaseComObject(gdataset); } Marshal.ReleaseComObject(geoDataset); if (bFC2FCResult_Temp == true) { iAddSuccessCount += 1; } else { iAddFailCount += 1; } } } return; } catch (Exception ex) { LogAPI.Debug("将要素类拷贝至MDB中失败,异常原因: " + ex + " ; "); throw new Exception("GDB转化成MDB地址失败"); } finally { if (fws_gdb != null) { Marshal.ReleaseComObject(fws_gdb); fws_gdb = null; } wsapi_gdb?.CloseWorkspace(); fcapi_gdb?.CloseFeatureClass(); if (fc_gdb != null) { Marshal.ReleaseComObject(fc_gdb); fc_gdb = null; } if (fws_mdb != null) { Marshal.ReleaseComObject(fws_mdb); fws_mdb = null; } if (newFeatureClass != null) { Marshal.ReleaseComObject(newFeatureClass); newFeatureClass = null; } } } public bool MDBFc2FcGDB(IFeatureClass pInFeatureClass, IWorkspace pOutWorkspace, string poutFatureName, string pOutDataSetName = null, IQueryFilter queryFilter = null) { try { if (pInFeatureClass == null || pOutWorkspace == null || string.IsNullOrEmpty(poutFatureName)) return false; IFeatureClassName pInFeatureclassName; IDataset pIndataset; pIndataset = (IDataset)pInFeatureClass; pInFeatureclassName = (IFeatureClassName)pIndataset.FullName; IFeatureClassName pOutFeatureClassName; IDatasetName pOutDatasetName; IDataset pOutDataset; pOutDataset = (IDataset)pOutWorkspace; IEnumDatasetName dataset = pOutWorkspace.get_DatasetNames(esriDatasetType.esriDTFeatureDataset); while ((pOutDatasetName = dataset.Next()) != null) { if (pOutDatasetName.Name == pOutDataSetName) { break; } } pOutFeatureClassName = new FeatureClassNameClass() { Name = poutFatureName }; if (pOutDatasetName == null) { pOutDatasetName = (IDatasetName)pOutFeatureClassName; pOutDatasetName.WorkspaceName = (IWorkspaceName)pOutDataset.FullName; pOutDatasetName.Name = poutFatureName; } pOutFeatureClassName.FeatureDatasetName = pOutDatasetName; IFields pInFields; IFieldChecker pFieldChecker = new FieldCheckerClass(); pInFields = pInFeatureClass.Fields; //pOutFields pFieldChecker.Validate(pInFields, out IEnumFieldError pError, out IFields pOutFields); Console.WriteLine(pError); IFeatureDataConverter one2another = new FeatureDataConverterClass(); try { if (pOutWorkspace.Type == esriWorkspaceType.esriRemoteDatabaseWorkspace) { one2another.ConvertFeatureClass(pInFeatureclassName, null, null, pOutFeatureClassName, null, pOutFields, "", 1000, 0); } else { one2another.ConvertFeatureClass(pInFeatureclassName, queryFilter, pOutDatasetName as IFeatureDatasetName, pOutFeatureClassName, null, pOutFields, "", 1000, 0); } } finally { Marshal.ReleaseComObject(one2another); } return true; } catch (Exception ex) { throw ex; } } public bool GDBFc2FcMDB(IFeatureClass pInFeatureClass, IWorkspace pOutWorkspace, string poutFatureName, string pOutDataSetName = null, IQueryFilter queryFilter = null) { try { if (pInFeatureClass == null || pOutWorkspace == null || string.IsNullOrEmpty(poutFatureName)) return false; IFeatureClassName pInFeatureclassName; IDataset pIndataset; pIndataset = (IDataset)pInFeatureClass; pInFeatureclassName = (IFeatureClassName)pIndataset.FullName; IFeatureClassName pOutFeatureClassName; IDatasetName pOutDatasetName; IDataset pOutDataset; pOutDataset = (IDataset)pOutWorkspace; IEnumDatasetName dataset = pOutWorkspace.get_DatasetNames(esriDatasetType.esriDTFeatureDataset); while ((pOutDatasetName = dataset.Next()) != null) { if (pOutDatasetName.Name == pOutDataSetName) { break; } } pOutFeatureClassName = new FeatureClassNameClass() { Name = poutFatureName }; if (pOutDatasetName == null) { pOutDatasetName = (IDatasetName)pOutFeatureClassName; pOutDatasetName.WorkspaceName = (IWorkspaceName)pOutDataset.FullName; pOutDatasetName.Name = poutFatureName; } pOutFeatureClassName.FeatureDatasetName = pOutDatasetName; IFields pInFields, pOutFields; IFieldChecker pFieldChecker = new FieldCheckerClass(); IEnumFieldError pError; pInFields = pInFeatureClass.Fields; //pOutFields pFieldChecker.Validate(pInFields, out pError, out pOutFields); Console.WriteLine(pError); IFeatureDataConverter one2another = new FeatureDataConverterClass(); try { if (pOutWorkspace.Type == esriWorkspaceType.esriRemoteDatabaseWorkspace) { one2another.ConvertFeatureClass(pInFeatureclassName, null, null, pOutFeatureClassName, null, pOutFields, "", 1000, 0); } else { one2another.ConvertFeatureClass(pInFeatureclassName, queryFilter, pOutDatasetName as IFeatureDatasetName, pOutFeatureClassName, null, pOutFields, "", 1000, 0); } } finally { Marshal.ReleaseComObject(one2another); } return true; } catch (Exception ex) { throw ex; } } private void BtnClose_Click(object sender, RoutedEventArgs e) { this.Close(); } } }