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();
        }
    }
}