static void Main(string[] args) { // 读取本工具所在路径下的config配置文件 string errorString = null; string configFilePath = Utils.CombinePath(AppValues.PROGRAM_FOLDER_PATH, AppValues.CONFIG_FILE_NAME); AppValues.ConfigData = TxtConfigReader.ParseTxtConfigFile(configFilePath, ":", out errorString); if (!string.IsNullOrEmpty(errorString)) { Utils.LogErrorAndExit(errorString); } // 检查填写的Excel导出目录是否存在 if (AppValues.ConfigData.ContainsKey(AppValues.APP_CONFIG_KEY_EXPORT_EXCEL_PATH)) { AppValues.ExportExcelPath = AppValues.ConfigData[AppValues.APP_CONFIG_KEY_EXPORT_EXCEL_PATH].Trim(); if (!Directory.Exists(AppValues.ExportExcelPath)) { Utils.LogErrorAndExit(string.Format("config配置文件中声明的导出Excel文件的存放目录不存在,你填写的为\"{0}\"", AppValues.ExportExcelPath)); } } else { Utils.LogErrorAndExit(string.Format("未在config配置文件中以名为\"{0}\"的key声明导出Excel文件的存放目录", AppValues.APP_CONFIG_KEY_EXPORT_EXCEL_PATH)); } // 获取设置的Excel文件中列的最大宽度 if (AppValues.ConfigData.ContainsKey(AppValues.APP_CONFIG_KEY_EXCEL_COLUMN_MAX_WIDTH)) { double inputExcelColumnMaxWidth = -1; string inputParam = AppValues.ConfigData[AppValues.APP_CONFIG_KEY_EXCEL_COLUMN_MAX_WIDTH]; if (double.TryParse(inputParam, out inputExcelColumnMaxWidth) == true) { if (inputExcelColumnMaxWidth > 0) { AppValues.ExcelColumnMaxWidth = inputExcelColumnMaxWidth; } else { Utils.LogErrorAndExit(string.Format("config配置文件中声明的Excel文件中列的最大宽度非法,必须大于0,你输入的为\"{0}\"", inputParam)); } } else { Utils.LogErrorAndExit(string.Format("config配置文件中声明的Excel文件中列的最大宽度不是一个合法数字,你输入的为\"{0}\"", inputParam)); } } else { Utils.LogWarning(string.Format("警告:未在config配置文件中以名为\"{0}\"的key声明生成的Excel文件中列的最大宽度,本工具将不对生成的Excel文件进行美化", AppValues.APP_CONFIG_KEY_EXCEL_COLUMN_MAX_WIDTH)); } const int COLOR_INDEX_MIN = 0; const int COLOR_INDEX_MAX = 56; // 获取设置的每列背景色,如果进行了设置需检查ColorIndex是否正确 if (AppValues.ConfigData.ContainsKey(AppValues.APP_CONFIG_KEY_COLUMN_BACKGROUND_COLOR)) { AppValues.ColumnBackgroundColorIndex = new List <int>(); string inputParam = AppValues.ConfigData[AppValues.APP_CONFIG_KEY_COLUMN_BACKGROUND_COLOR]; string[] colorIndexString = inputParam.Split(new char[] { ',' }, StringSplitOptions.RemoveEmptyEntries); if (colorIndexString.Length > 0) { foreach (string oneColorIndexString in colorIndexString) { int oneColorIndex = -1; if (int.TryParse(oneColorIndexString, out oneColorIndex) == true) { if (oneColorIndex >= COLOR_INDEX_MIN && oneColorIndex <= COLOR_INDEX_MAX) { AppValues.ColumnBackgroundColorIndex.Add(oneColorIndex); } else { Utils.LogErrorAndExit(string.Format("config配置文件中声明的颜色索引值\"{0}\"非法,必须介于{1}到{2}之间", oneColorIndex, COLOR_INDEX_MIN, COLOR_INDEX_MAX)); } } else { Utils.LogErrorAndExit(string.Format("config配置文件中声明的颜色索引值\"{0}\"不是一个合法数字", oneColorIndexString)); } } } else { Utils.LogErrorAndExit(string.Format("config配置文件中以名为\"{0}\"的key声明各列背景色不允许为空", AppValues.APP_CONFIG_KEY_COLUMN_BACKGROUND_COLOR)); } } // 获取设置的data、config两张Sheet表的标签按钮颜色 if (AppValues.ConfigData.ContainsKey(AppValues.APP_CONFIG_KEY_DATA_SHEET_TAB_COLOR)) { string colorIndexString = AppValues.ConfigData[AppValues.APP_CONFIG_KEY_DATA_SHEET_TAB_COLOR]; int colorIndex = -1; if (int.TryParse(colorIndexString, out colorIndex) == true) { if (colorIndex >= COLOR_INDEX_MIN && colorIndex <= COLOR_INDEX_MAX) { AppValues.DataSheetTabColorIndex = colorIndex; } else { Utils.LogErrorAndExit(string.Format("config配置文件中声明的data表标签按钮颜色索引值\"{0}\"非法,必须介于{1}到{2}之间", colorIndex, COLOR_INDEX_MIN, COLOR_INDEX_MAX)); } } else { Utils.LogErrorAndExit(string.Format("config配置文件中声明的data表标签按钮颜色索引值\"{0}\"不是一个合法数字", colorIndexString)); } } if (AppValues.ConfigData.ContainsKey(AppValues.APP_CONFIG_KEY_CONFIG_SHEET_TAB_COLOR)) { string colorIndexString = AppValues.ConfigData[AppValues.APP_CONFIG_KEY_CONFIG_SHEET_TAB_COLOR]; int colorIndex = -1; if (int.TryParse(colorIndexString, out colorIndex) == true) { if (colorIndex >= COLOR_INDEX_MIN && colorIndex <= COLOR_INDEX_MAX) { AppValues.ConfigSheetTabColorIndex = colorIndex; } else { Utils.LogErrorAndExit(string.Format("config配置文件中声明的config表标签按钮颜色索引值\"{0}\"非法,必须介于{1}到{2}之间", colorIndex, COLOR_INDEX_MIN, COLOR_INDEX_MAX)); } } else { Utils.LogErrorAndExit(string.Format("config配置文件中声明的config表标签按钮颜色索引值\"{0}\"不是一个合法数字", colorIndexString)); } } // 获取要导出的数据表名 List <string> exportTableName = new List <string>(); // 在这里自定义获取要导出的数据表名的方法(这里以在config.txt中进行配置为例,还可以采用类似表名特殊前缀标识等方式实现) if (AppValues.ConfigData.ContainsKey(AppValues.APP_CONFIG_KEY_EXPORT_DATA_TABLE_NAMES)) { string exportTableNameString = AppValues.ConfigData[AppValues.APP_CONFIG_KEY_EXPORT_DATA_TABLE_NAMES].Trim(); if (string.IsNullOrEmpty(exportTableNameString)) { Utils.LogErrorAndExit(string.Format("config配置文件中以名为\"{0}\"的key声明要导出的数据表名不允许为空", AppValues.APP_CONFIG_KEY_EXPORT_DATA_TABLE_NAMES)); } else { string[] tableNames = exportTableNameString.Split(new char[] { '|' }, StringSplitOptions.RemoveEmptyEntries); foreach (string tableName in tableNames) { exportTableName.Add(tableName.Trim()); } } } else { Utils.LogErrorAndExit(string.Format("未在config配置文件中以名为\"{0}\"的key声明要导出的数据表名", AppValues.APP_CONFIG_KEY_EXPORT_DATA_TABLE_NAMES)); } // 连接MySQL数据库 MySQLOperateHelper.ConnectToDatabase(out errorString); if (!string.IsNullOrEmpty(errorString)) { Utils.LogErrorAndExit(string.Format("无法连接到MySQL数据库,{0}", errorString)); } // 检查声明的要导出的数据库表格是否存在,若存在导出到Excel foreach (string tableName in exportTableName) { if (MySQLOperateHelper.ExistTableNames.Contains(tableName)) { Utils.Log(string.Format("导出数据表{0}:", tableName)); ExcelOperateHelper.ExportToExcel(tableName); Utils.Log("成功"); } else { Utils.LogErrorAndExit(string.Format("\n错误:数据库中不存在名为{0}的数据表,请检查配置中声明的导出数据表名与数据库是否对应", tableName)); } } Utils.Log("\n按任意键退出本工具"); Console.ReadKey(); }
private void btnCompare_Click(object sender, EventArgs e) { rtxResult.Text = string.Empty; string errorString = null; // 检查新旧数据库连接字符串是否输入 AppValues.ConnectStringForOldDatabase = txtOldConnString.Text.Trim(); AppValues.ConnectStringForNewDatabase = txtNewConnString.Text.Trim(); if (string.IsNullOrEmpty(AppValues.ConnectStringForOldDatabase)) { MessageBox.Show("必须输入旧版数据库连接字符串", "错误", MessageBoxButtons.OK, MessageBoxIcon.Error); return; } if (string.IsNullOrEmpty(AppValues.ConnectStringForNewDatabase)) { MessageBox.Show("必须输入新版数据库连接字符串", "错误", MessageBoxButtons.OK, MessageBoxIcon.Error); return; } if (AppValues.ConnectStringForOldDatabase.Equals(AppValues.ConnectStringForNewDatabase)) { MessageBox.Show("输入的新旧两数据库连接字符串重复", "错误", MessageBoxButtons.OK, MessageBoxIcon.Error); return; } // 检查配置文件 AppValues.ConfigFilePath = txtConfigPath.Text.Trim(); if (string.IsNullOrEmpty(AppValues.ConfigFilePath)) { DialogResult dialogResult = MessageBox.Show("未指定配置文件,本工具将默认比较两数据库中所有表格的结构和数据,确定要这样做吗?\n\n点击“是”进行默认比较,点击“否”放弃", "警告", MessageBoxButtons.YesNo, MessageBoxIcon.Warning); if (dialogResult == DialogResult.No) { return; } else { AppValues.AllTableCompareRule = new Dictionary <string, TableCompareRule>(); } } else { Utils.AppendOutputText("读取配置文件:", OutputType.Comment); AppValues.AllTableCompareRule = ConfigReader.LoadConfig(AppValues.ConfigFilePath, out errorString); if (!string.IsNullOrEmpty(errorString)) { MessageBox.Show(string.Concat("配置文件中存在以下错误,请修正后重试:\n\n", errorString), "错误", MessageBoxButtons.OK, MessageBoxIcon.Error); return; } else { Utils.AppendOutputText("成功\n", OutputType.None); } } // 连接两数据库 Utils.AppendOutputText("连接旧版数据库:", OutputType.Comment); MySQLOperateHelper.ConnectToDatabase(AppValues.ConnectStringForOldDatabase, out AppValues.OldConn, out AppValues.OldSchemaName, out AppValues.OldExistTableNames, out errorString); if (!string.IsNullOrEmpty(errorString)) { MessageBox.Show(string.Concat("连接旧版数据库失败,错误原因为:", errorString), "错误", MessageBoxButtons.OK, MessageBoxIcon.Error); return; } else { Utils.AppendOutputText("成功\n", OutputType.None); } Utils.AppendOutputText("连接新版数据库:", OutputType.Comment); MySQLOperateHelper.ConnectToDatabase(AppValues.ConnectStringForNewDatabase, out AppValues.NewConn, out AppValues.NewSchemaName, out AppValues.NewExistTableNames, out errorString); if (!string.IsNullOrEmpty(errorString)) { MessageBox.Show(string.Concat("连接新版数据库失败,错误原因为:", errorString), "错误", MessageBoxButtons.OK, MessageBoxIcon.Error); return; } else { Utils.AppendOutputText("成功\n", OutputType.None); } // 整理数据库结构信息 Utils.AppendOutputText("分析旧版数据库表结构:", OutputType.Comment); AppValues.OldTableInfo = new Dictionary <string, TableInfo>(); foreach (string tableName in AppValues.OldExistTableNames) { TableInfo tableInfo = MySQLOperateHelper.GetTableInfo(AppValues.OldSchemaName, tableName, AppValues.OldConn); AppValues.OldTableInfo.Add(tableName, tableInfo); } Utils.AppendOutputText("成功\n", OutputType.None); Utils.AppendOutputText("分析新版数据库表结构:", OutputType.Comment); AppValues.NewTableInfo = new Dictionary <string, TableInfo>(); foreach (string tableName in AppValues.NewExistTableNames) { TableInfo tableInfo = MySQLOperateHelper.GetTableInfo(AppValues.NewSchemaName, tableName, AppValues.NewConn); AppValues.NewTableInfo.Add(tableName, tableInfo); } Utils.AppendOutputText("成功\n", OutputType.None); Utils.AppendOutputText("\n", OutputType.None); // 进行对比,并展示结果 MySQLOperateHelper.CompareAndShowResult(out errorString); if (!string.IsNullOrEmpty(errorString)) { string tips = string.Concat("对比中发现以下问题,请修正后重新进行比较:\n\n", errorString); MessageBox.Show(tips, "错误", MessageBoxButtons.OK, MessageBoxIcon.Error); } else { Utils.AppendOutputText("\n", OutputType.Comment); Utils.AppendOutputText("对比完毕", OutputType.Comment); } }