年度变更建库软件5.0版本
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.

220 lines
8.6 KiB

6 months ago
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;
}
}
}
}