You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
					
					
						
							219 lines
						
					
					
						
							8.6 KiB
						
					
					
				
			
		
		
	
	
							219 lines
						
					
					
						
							8.6 KiB
						
					
					
				using KGIS.Framework.DBOperator; | 
						|
using KGIS.Framework.Maps; | 
						|
using KGIS.Framework.Utils; | 
						|
using KGIS.Framework.Utils.Helper; | 
						|
using Kingo.Plugin.DataDictionary.Helper; | 
						|
using Kingo.PluginServiceInterface; | 
						|
using System; | 
						|
using System.Collections.Generic; | 
						|
using System.Data; | 
						|
using System.Data.SQLite; | 
						|
using System.IO; | 
						|
using System.Windows; | 
						|
 | 
						|
namespace Kingo.Plugin.DataDictionary.Views | 
						|
{ | 
						|
    /// <summary> | 
						|
    /// FrmDicManagerExport.xaml 的交互逻辑 | 
						|
    /// </summary> | 
						|
    public partial class FrmDicManageExport : BaseWindow | 
						|
    { | 
						|
        public FrmDicManageExport() | 
						|
        { | 
						|
            InitializeComponent(); | 
						|
        } | 
						|
 | 
						|
        private void btnBrowse_Click_1(object sender, RoutedEventArgs e) | 
						|
        { | 
						|
            System.Windows.Forms.SaveFileDialog dialog = new System.Windows.Forms.SaveFileDialog(); | 
						|
 | 
						|
            dialog.DefaultExt = "kzd"; | 
						|
            dialog.Filter = "字典文件|*.kzd|Excel文件|*.xlsx"; | 
						|
            //dialog.Filter = "kzd文件(*.kzd)|*.kzd;Excel Files(*.xlsx)|*.xlsx"; | 
						|
            if (dialog.ShowDialog() == System.Windows.Forms.DialogResult.OK) | 
						|
            { | 
						|
                this.txtPath.Text = dialog.FileName; | 
						|
            } | 
						|
        } | 
						|
 | 
						|
        private void btnExport_Click_1(object sender, RoutedEventArgs e) | 
						|
        { | 
						|
            try | 
						|
            { | 
						|
                if (string.IsNullOrWhiteSpace(txtPath.Text)) | 
						|
                { | 
						|
                    MessageHelper.Show("未获取到文件路径!"); | 
						|
                    return; | 
						|
                } | 
						|
                string path = txtPath.Text; | 
						|
                if (File.Exists(path)) | 
						|
                { | 
						|
                    var result = MessageHelper.ShowYesNoAndTips("文件已存在,是否覆盖?"); | 
						|
                    if (result == System.Windows.Forms.DialogResult.No) | 
						|
                    { | 
						|
                        return; | 
						|
                    } | 
						|
                } | 
						|
                if (path.Contains(".xlsx")) | 
						|
                { | 
						|
                    ExportOwnerUnitCode exportOwnerUnitCode = new ExportOwnerUnitCode(); | 
						|
                    exportOwnerUnitCode.OutPath = path; | 
						|
                    exportOwnerUnitCode.Export(); | 
						|
                } | 
						|
                else if (path.Contains(".kzd")) | 
						|
                { | 
						|
                    string dbPath = null; | 
						|
                    if ((MapsManager.Instance.CurrProjectInfo as ProjectInfo) is ProjectInfo) | 
						|
                    { | 
						|
                        dbPath = ((MapsManager.Instance.CurrProjectInfo as ProjectInfo) as ProjectInfo).GetDicDataPath(); | 
						|
                    } | 
						|
                    File.Copy(dbPath, path, true); | 
						|
 | 
						|
                    //创建数据库连接 | 
						|
                    IRDBHelper dbHelper = RDBFactory.CreateDbHelper(path, DatabaseType.SQLite); | 
						|
                    List<string> tables = GetTableNames(path); | 
						|
                    List<string> views = GetViewNames(path); | 
						|
                    try | 
						|
                    { | 
						|
                        //表 | 
						|
                        for (int i = 0; i < tables.Count; i++) | 
						|
                        { | 
						|
                            if (tables[i].Contains("Sys_DicDetail") || tables[i].Contains("Sys_DicManage") || tables[i].Contains("Sys_DicMappingTable") || tables[i].Contains("Sys_DicType") || tables[i].Contains("sqlite_sequence")/*系统自动增量键的表*/) | 
						|
                            { | 
						|
                                dbHelper.ExecuteDatatable(tables[i], $"delete from  {tables[i]}", false); | 
						|
                                continue; | 
						|
                            } | 
						|
                            dbHelper.ExecuteDatatable(tables[i], $"Drop table {tables[i]}", false); | 
						|
                        } | 
						|
                        //视图文件 | 
						|
                        for (int j = 0; j < views.Count; j++) | 
						|
                        { | 
						|
                            dbHelper.ExecuteDatatable(views[j], $"Drop view {views[j]}", false); | 
						|
                        } | 
						|
                        //DropSQLiteView(path, views); | 
						|
                    } | 
						|
                    catch | 
						|
                    { | 
						|
                    } | 
						|
                    finally | 
						|
                    { | 
						|
                        if (dbHelper != null && dbHelper.State != System.Data.ConnectionState.Closed) | 
						|
                            dbHelper.DisConnect(); | 
						|
                    } | 
						|
                    UpdateTable(dbPath, path); | 
						|
                } | 
						|
                MessageHelper.Show("字典导出已完成!"); | 
						|
                this.Close(); | 
						|
            } | 
						|
            catch (Exception ex) | 
						|
            { | 
						|
                MessageHelper.ShowError("导出数据字典异常:" + ex.Message); | 
						|
            } | 
						|
        } | 
						|
 | 
						|
        private List<string> GetTableNames(string path) | 
						|
        { | 
						|
            // 获取指定数据库中的所有表名 | 
						|
            List<string> tables = new List<string>(); | 
						|
            //string connectionString = @"Data Source='" + path + "';Version=3;"; | 
						|
            using (SQLiteConnection conn = new SQLiteConnection("Data Source=" + path)) | 
						|
            { | 
						|
                conn.Open(); | 
						|
                // 获取数据库中的所有表名 | 
						|
                string sqlTableNames = "select name from sqlite_master where type='table' order by name;"; | 
						|
                // 创建命令对象 | 
						|
                SQLiteCommand cmd = new SQLiteCommand(sqlTableNames, conn); | 
						|
                using (SQLiteDataReader dr = cmd.ExecuteReader()) | 
						|
                { | 
						|
                    while (dr.Read()) | 
						|
                    { | 
						|
                        // 表名 | 
						|
                        tables.Add(dr["Name"].ToString()); | 
						|
                    } | 
						|
                } | 
						|
            } | 
						|
            return tables; | 
						|
        } | 
						|
        private void UpdateTable(string path, string tagrtPath) | 
						|
        { | 
						|
            List<string> tableName = new List<string>(); | 
						|
            tableName.Add("Sys_DicDetail"); | 
						|
            tableName.Add("Sys_DicManage"); | 
						|
            tableName.Add("Sys_DicMappingTable"); | 
						|
            tableName.Add("Sys_DicType"); | 
						|
            IRDBHelper kzdHelper = RDBFactory.CreateDbHelper(path, DatabaseType.SQLite); | 
						|
            try | 
						|
            { | 
						|
                for (int i = 0; i < tableName.Count; i++) | 
						|
                { | 
						|
                    DataTable dtRST = kzdHelper.ExecuteDatatable(tableName[i], $"SELECT * FROM {tableName[i]}", false); | 
						|
                    DataTableToSQLite myTabInfo1 = new DataTableToSQLite(dtRST, path, false); | 
						|
                    myTabInfo1.ImportToSqliteBatch(dtRST, tagrtPath); | 
						|
                } | 
						|
            } | 
						|
            catch (Exception ex) | 
						|
            { | 
						|
                LogAPI.Debug(ex); | 
						|
                return; | 
						|
            } | 
						|
            finally | 
						|
            { | 
						|
                if (kzdHelper != null && kzdHelper.State != System.Data.ConnectionState.Closed) | 
						|
                    kzdHelper.DisConnect(); | 
						|
            } | 
						|
        } | 
						|
 | 
						|
        private List<string> GetViewNames(string path) | 
						|
        { | 
						|
            // 获取指定数据库中的所有视图名 | 
						|
            List<string> views = new List<string>(); | 
						|
            //string connectionString = @"Data Source='" + path + "';Version=3;"; | 
						|
            using (SQLiteConnection conn = new SQLiteConnection("Data Source=" + path)) | 
						|
            { | 
						|
                conn.Open(); | 
						|
                // 获取数据库中的所有视图名 | 
						|
                string sqlViewNames = "select name from sqlite_master where type='view' order by name"; | 
						|
                // 创建命令对象 | 
						|
                SQLiteCommand cmd = new SQLiteCommand(sqlViewNames, conn); | 
						|
                using (SQLiteDataReader dr = cmd.ExecuteReader()) | 
						|
                { | 
						|
                    while (dr.Read()) | 
						|
                    { | 
						|
                        // 表名 | 
						|
                        views.Add(dr["Name"].ToString()); | 
						|
                    } | 
						|
                } | 
						|
            } | 
						|
            return views; | 
						|
        } | 
						|
        private void DropSQLiteView(string dbPath, List<string> viewsSql) | 
						|
        { | 
						|
            try | 
						|
            { | 
						|
                using (System.Data.SQLite.SQLiteConnection conn = new System.Data.SQLite.SQLiteConnection("Data Source=" + dbPath)) | 
						|
                { | 
						|
                    conn.Open(); | 
						|
                    using (System.Data.SQLite.SQLiteTransaction pTrans = conn.BeginTransaction()) | 
						|
                    { | 
						|
                        using (System.Data.SQLite.SQLiteCommand cmd = new System.Data.SQLite.SQLiteCommand(conn)) | 
						|
                        { | 
						|
                            for (int i = 0; i < viewsSql.Count; i++) | 
						|
                            { | 
						|
                                cmd.CommandText = $"drop view {viewsSql[i]};"; | 
						|
                                cmd.ExecuteNonQuery(); | 
						|
                            } | 
						|
                            pTrans.Commit(); | 
						|
                        } | 
						|
                    } | 
						|
                    conn.Close(); | 
						|
                } | 
						|
            } | 
						|
            catch (Exception ex) | 
						|
            { | 
						|
                LogAPI.Debug("删除视图文件(地址:" + dbPath + ") 执行失败,异常原因: " + ex + " ; "); | 
						|
                return; | 
						|
            } | 
						|
        } | 
						|
 | 
						|
    } | 
						|
}
 | 
						|
 |