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

288 lines
11 KiB

6 months ago
using System;
using System.Collections.Generic;
using System.Data;
using System.Data.SQLite;
using System.IO;
using System.Linq;
using System.Text;
using System.Windows;
using KGIS.Framework.DBOperator;
using KGIS.Framework.Maps;
using KGIS.Framework.Platform;
using KGIS.Framework.Utils;
using KGIS.Framework.Utils.Dialog;
using KGIS.Framework.Utils.Helper;
using KGIS.Framework.Utils.Utility;
using Kingo.PluginServiceInterface;
namespace Kingo.Plugin.DataDictionary.Views
{
/// <summary>
/// FrmDicManager.xaml 的交互逻辑
/// </summary>
public partial class FrmDicManageImport : BaseWindow
{
public FrmDicManageImport()
{
InitializeComponent();
}
private void btnBrowse_Click_1(object sender, RoutedEventArgs e)
{
OpenFileDialog dialog = new OpenFileDialog();
dialog.DefaultExt = "kzd";
dialog.Filter = "kzd文件(*.kzd)|*.kzd|Excel文件|*.xlsx|Excel文件|*.xls";
if (dialog.ShowDialog())
{
this.txtPath.Text = dialog.FileName;
}
}
private void btnImport_Click_1(object sender, RoutedEventArgs e)
{
try
{
if (string.IsNullOrWhiteSpace(txtPath.Text))
{
MessageHelper.Show("未获取到文件路径:" + txtPath.Text);
return;
}
string path = txtPath.Text;
if (!File.Exists(path))
{
MessageHelper.Show("文件不存在,请重新选择!");
return;
}
if (path.EndsWith(".kzd"))
{
string tagrtPath = null;
if (MapsManager.Instance.CurrProjectInfo is ProjectInfo)
{
tagrtPath = (MapsManager.Instance.CurrProjectInfo as ProjectInfo).GetDicDataPath();
UpdateTable(path, tagrtPath);
}
if (string.IsNullOrWhiteSpace(tagrtPath))
{
tagrtPath = Path.Combine((MapsManager.Instance.CurrProjectInfo as ProjectInfo).GetProjFilePath(), "dic.mdb");
File.Copy(path, tagrtPath, true);
}
GetAllDic(tagrtPath);
MessageHelper.Show("字典导入已完成!");
}
else if (path.EndsWith(".xls") || path.EndsWith(".xlsx"))
{
#region 支持导入Excel格式的权属单位代码
FrmDicManage.frmDicManage.ImportExcel(path);
#endregion
}
else
{
MessageHelper.Show("字典导入目前仅支持.kzd|.xlsx|.xls格式的数据,请选择正确的文件!");
return;
}
FrmDicManage.frmDicManage.LoadTree();
this.Close();
}
catch (Exception ex)
{
LogAPI.Debug("导入数据字典异常" + ex.Message);
LogAPI.Debug("导入数据字典异常" + ex.StackTrace);
MessageHelper.ShowError("导入数据字典异常:" + ex.Message);
}
}
public void Insert_sql(DataTable dic, Dictionary<string, string> dics, IRDBHelper SqlHelper, string Table)
{
#region 获取所有字段
StringBuilder columns = new StringBuilder();
foreach (var item in dics)
{
columns.Append("," + item.Key);
}
#endregion
#region 数据入库
int CycleIndex = 0;
StringBuilder insertsql = new StringBuilder();
StringBuilder strsql = new StringBuilder();
StringBuilder stringBuilder = new StringBuilder();
var count = dic.Rows.Count;
foreach (DataRow item0 in dic.Rows)
{
CycleIndex++;
StringBuilder data = new StringBuilder();//insert语句插入字段
foreach (var item1 in dics)
{
if (item0[item1.Key].ToString().Trim() == "")
{
data.Append(",null");
}
else
{
data.Append((",'" + item0[item1.Key].ToString().Trim().Replace("'", "''").Replace("\n", "").Replace(" ", "").Replace("\t", "").Replace("\r", "") + "'"));
}
}
insertsql.Append(string.Format("insert into " + Table + "({0})values({1});", columns.ToString().Substring(1), data.ToString().Substring(1)));
#region 提交数据
if (count < 10000)
{
if (CycleIndex < count)
{
stringBuilder.Append(insertsql.ToString());
insertsql.Clear();
}
else if (CycleIndex == count)
{
stringBuilder.Append(insertsql.ToString());
var num = SqlHelper.ExecuteNonQuery(stringBuilder.ToString(), CommandType.Text);
if (num < 0 && stringBuilder.ToString() != "")
return;
}
}
else
{
strsql.Append(insertsql.ToString());
insertsql.Clear();
}
if (CycleIndex == 10000)
{
try
{
var num = SqlHelper.ExecuteNonQuery(strsql.ToString(), CommandType.Text);
if (num < 0 && strsql.ToString() != "")
return;
insertsql.Clear();
strsql.Clear();
count = count - CycleIndex;
CycleIndex = 0;
}
catch (Exception exc)
{
throw new Exception(exc.Message);
}
finally
{
GC.Collect();
}
}
#endregion
}
#endregion
}
private void UpdateTable(string path, string tagrtPath)
{
if (string.IsNullOrEmpty(path) || string.IsNullOrEmpty(tagrtPath)) return;
List<string> tableName = new List<string>();
tableName.Add("Sys_DicDetail");
tableName.Add("Sys_DicManage");
tableName.Add("Sys_DicMappingTable");
tableName.Add("Sys_DicType");
IRDBHelper dbHelper = RDBFactory.CreateDbHelper(tagrtPath, DatabaseType.SQLite);
List<string> tables = GetTableNames(tagrtPath);
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"))
{
dbHelper.ExecuteDatatable(tables[i], $"delete from {tables[i]}", false);
continue;
}
}
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 (dbHelper != null && dbHelper.State != System.Data.ConnectionState.Closed)
dbHelper.DisConnect();
if (kzdHelper != null && kzdHelper.State != System.Data.ConnectionState.Closed)
kzdHelper.DisConnect();
}
}
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 List<DataDicTionary> GetAllDic(string dbPath)
{
DataTable dt = null;
List<DataDicTionary> result = new List<DataDicTionary>();
IRDBHelper rdbHelper = null;
try
{
//string dbPath = (MapsManager.Instance.CurrProjectInfo as ProjectInfo).GetDicDataPath();
if (!string.IsNullOrWhiteSpace(dbPath))
{
if (dbPath.EndsWith("sqlite"))
{
rdbHelper = RDBFactory.CreateDbHelper(dbPath, DatabaseType.SQLite);
}
else if (dbPath.EndsWith("mdb"))
{
string connStr = SysConfigsOprator.GetDBConnectionByName("MDBOledbConnection");
connStr = string.Format(connStr, dbPath);
rdbHelper = RDBFactory.CreateDbHelper(connStr, DatabaseType.MSAccess);
}
string strSQL = "select * from Sys_DicDetail";
dt = rdbHelper.ExecuteDatatable("Dic", strSQL, true);
if (dt != null)
{
//Bug-12137 霍岩 2018-11-14 使用CODE字段按顺序排序
result = TBToList.ToList<DataDicTionary>(dt).OrderBy(x => x.CODE).ToList();
result.ForEach(x => x.DisplayName = x.CODE + "-" + x.NAME);
}
}
}
catch (Exception ex)
{
LogAPI.Debug(ex);
}
finally
{
if (rdbHelper != null)
{
rdbHelper.DisConnect();
}
if (dt != null)
{
dt.Clear();
dt.Dispose();
}
}
return result;
}
}
}