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 { /// /// FrmDicManager.xaml 的交互逻辑 /// 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 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 tableName = new List(); tableName.Add("Sys_DicDetail"); tableName.Add("Sys_DicManage"); tableName.Add("Sys_DicMappingTable"); tableName.Add("Sys_DicType"); IRDBHelper dbHelper = RDBFactory.CreateDbHelper(tagrtPath, DatabaseType.SQLite); List 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 GetTableNames(string path) { // 获取指定数据库中的所有表名 List tables = new List(); //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 GetAllDic(string dbPath) { DataTable dt = null; List result = new List(); 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(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; } } }