using Newtonsoft.Json.Linq; using System.Data; using Tiobon.Core.Common.DB.Dapper; using Tiobon.Core.Common.DB.Dapper.DBManager; using Tiobon.Core.Common.Https.HttpPolly; namespace Tiobon.Core.Controllers; /// /// 公共服务 /// [Produces("application/json")] [Route("api/Common")] [Authorize(Permissions.Name), ApiExplorerSettings(GroupName = Grouping.GroupName_System)] public class CommonController : BaseApiController { private readonly ICommonServices _commonServices; private readonly IHttpPollyHelper _httpPollyHelper; /// /// 构造函数 /// /// /// /// public CommonController( ICommonServices commonServices, IHttpPollyHelper httpPollyHelper) { _commonServices = commonServices; _httpPollyHelper = httpPollyHelper; } #region 获取菜单 /// /// 获取菜单 /// /// /// [HttpPost, Route("GetMenu")] public async Task> GetMenuAsync([FromBody] MenuParam param) { return await _commonServices.GetMenuAsync(param); } #endregion #region 获取模块信息接口 /// /// 获取模块信息接口 /// /// /// [HttpPost, Route("GetModuleInfo")] public async Task> GetModuleInfoAsync([FromBody] ModuleParam param) { return await _commonServices.GetModuleInfoAsync(param); } /// /// 获取模块信息接口 /// /// /// [HttpPost, Route("GetESSModuleInfo")] public async Task> GetESSModuleInfoAsync([FromBody] ModuleParam param) { return await _commonServices.GetESSModuleInfoAsync(param); } #endregion #region 获取模块信息接口 /// /// 获取模块信息接口 /// /// /// /// [HttpPost, Route("GetSelect/{type}")] public async Task> GetSelectAsync(string type, string Keywords) { return await _commonServices.GetSelectAsync(type, Keywords); } #endregion #region 导出Excel /// /// 导出Excel /// /// /// [HttpPost, Route("ExportExcel")] public async Task> ExportExcelAsync([FromBody] QueryExport param) { return await _commonServices.ExportExcelAsync(param); } #endregion #region Excel导入 /// /// Excel导入 /// /// 文件 /// 菜单编号 /// 用户ID /// 多语 /// [HttpPost, Route("ImportExcel")] public async Task> ImportExcelAsync(IFormFile file, string menuName, int userId, int langId = 1) { return await _commonServices.ImportExcelAsync(file, menuName, langId, userId); } #endregion #region 获取流程信息 /// /// 获取流程信息 /// /// /// [HttpPost, Route("GetFlowInfo")] public async Task> GetFlowInfoAsync([FromBody] FlowParam param) { return await _commonServices.GetFlowInfoAsync(param); } #endregion #region 流程提交处理 /// /// 流程提交处理 /// /// /// [HttpPost, Route("CommitFlow")] public async Task CommitFlowAsync([FromBody] FlowCommitParam param) { return await _commonServices.CommitFlowAsync(param); } #endregion #region 调用存储过程封装 /// /// 调用存储过程封装 /// /// /// [HttpPost, Route("getPostCommonAES")] public async Task> getPostCommonAES([FromBody] JObject param) { return await _commonServices.getPostCommonAES(param); } /// /// 调用存储过程封装 /// /// /// [HttpPost, Route("getPostCommon")] public async Task> getPostCommon([FromBody] JObject param) { return await _commonServices.getPostCommon(param); } #endregion [HttpGet, AllowAnonymous, Route("Compare")] public IActionResult Download(Guid id) { StringBuilder sb = new StringBuilder(); DBServerProvider.SetConnection("defalut1", "Data Source=47.99.54.186;User ID=GHR;Password=Tiobon20190101;Database=Ghr5_MekTec;Encrypt=True;TrustServerCertificate=True;"); string sql = @"SELECT A.name AS COLUMN_NAME, B.name TABLE_NAME, C.value AS column_description, C.[name], D.NUMERIC_PRECISION, D.NUMERIC_SCALE, D.IS_NULLABLE, D.data_type COLUMN_TYPE, E.name AS ConstraintName, E.definition AS COLUMN_DEFAULT, A.object_id, B.object_id FROM sys.columns A LEFT JOIN sys.tables B ON A.object_id = B.object_id LEFT JOIN sys.extended_properties C ON C.major_id = A.object_id AND C.minor_id = A.column_id LEFT JOIN information_schema.columns D ON D.column_name = A.name AND D.TABLE_NAME = B.[name] LEFT JOIN sys.default_constraints E ON E.parent_object_id = A.object_id AND E.parent_column_id = A.column_id WHERE B.name IS NOT NULL"; #region step 1.1 加载表结构 // 源数据库 DataTable dt = DbAccess.GetDataTable(sql); var srcCloumns = dt .AsEnumerable() .Select(o => new CompareStructureCloumn { TableName = o.Field("TABLE_NAME"), ColumnName = o.Field("COLUMN_NAME"), DefaultValue = o.Field("COLUMN_DEFAULT"), Null = o.Field("IS_NULLABLE"), DataType = o.Field("COLUMN_TYPE"), //Key = o.Field("COLUMN_KEY"), //Collsion = o.Field("COLLATION_NAME"), //CharacterSet = o.Field("CHARACTER_SET_NAME") }) .ToList(); Console.WriteLine("", $"加载源数据库[hdis_compare]信息完毕:共有表{srcCloumns.Select(o => o.TableName).Distinct().Count()} 字段 {srcCloumns.Count}"); // 目标数据库 dt = DBServerProvider.GetSqlDapper("defalut1").GetDataTable(sql); var desrcCloumns = dt .AsEnumerable() .Select(o => new CompareStructureCloumn { TableName = o.Field("TABLE_NAME"), ColumnName = o.Field("COLUMN_NAME"), DefaultValue = o.Field("COLUMN_DEFAULT"), Null = o.Field("IS_NULLABLE"), DataType = o.Field("COLUMN_TYPE"), //Key = o.Field("COLUMN_KEY"), //Collsion = o.Field("COLLATION_NAME"), //CharacterSet = o.Field("CHARACTER_SET_NAME") }) .ToList(); Console.WriteLine("", $"加载目标数据库[hdis]信息完毕:共有表{desrcCloumns.Select(o => o.TableName).Distinct().Count()} 字段 {desrcCloumns.Count}"); // #region 1.2 加载外键 // sql = @"SELECT T.TABLE_NAME, T.CONSTRAINT_NAME, T.CONSTRAINT_TYPE, K.COLUMN_NAME, K.REFERENCED_TABLE_NAME, K.REFERENCED_COLUMN_NAME //FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS T //JOIN INFORMATION_SCHEMA.KEY_COLUMN_USAGE K ON T.CONSTRAINT_SCHEMA = K.CONSTRAINT_SCHEMA AND T.TABLE_NAME = K.TABLE_NAME AND T.CONSTRAINT_NAME = K.CONSTRAINT_NAME //JOIN INFORMATION_SCHEMA.REFERENTIAL_CONSTRAINTS R ON T.CONSTRAINT_SCHEMA = R.CONSTRAINT_SCHEMA AND T.TABLE_NAME = R.TABLE_NAME AND T.CONSTRAINT_NAME = R.CONSTRAINT_NAME //WHERE R.CONSTRAINT_SCHEMA = '{0}' AND T.CONSTRAINT_TYPE <> 'PRIMARY KEY';"; // // 源数据库 // dt = MySqlHelper.ExecuteDataset(m_ConnStr, string.Format(sql, "hdis_compare")).Tables[0]; // List srcConstraints = dt // .AsEnumerable() // .Select(m => new TableConstraint() // { // TABLE_NAME = m.Field(nameof(TableConstraint.TABLE_NAME)), // CONSTRAINT_NAME = m.Field(nameof(TableConstraint.CONSTRAINT_NAME)), // CONSTRAINT_TYPE = m.Field(nameof(TableConstraint.CONSTRAINT_TYPE)), // COLUMN_NAME = m.Field(nameof(TableConstraint.COLUMN_NAME)), // REFERENCED_TABLE_NAME = m.Field(nameof(TableConstraint.REFERENCED_TABLE_NAME)), // REFERENCED_COLUMN_NAME = m.Field(nameof(TableConstraint.REFERENCED_COLUMN_NAME)) // }) // .ToList(); // Console.WriteLine("", $"加载源数据库[hdis_compare]外键完毕:共有外键 {srcConstraints.Count} 条"); // // 目标据库 // dt = MySqlHelper.ExecuteDataset(m_ConnStr, string.Format(sql, "hdis")).Tables[0]; // List destConstraints = dt // .AsEnumerable() // .Select(m => new TableConstraint() // { // TABLE_NAME = m.Field(nameof(TableConstraint.TABLE_NAME)), // CONSTRAINT_NAME = m.Field(nameof(TableConstraint.CONSTRAINT_NAME)), // CONSTRAINT_TYPE = m.Field(nameof(TableConstraint.CONSTRAINT_TYPE)), // COLUMN_NAME = m.Field(nameof(TableConstraint.COLUMN_NAME)), // REFERENCED_TABLE_NAME = m.Field(nameof(TableConstraint.REFERENCED_TABLE_NAME)), // REFERENCED_COLUMN_NAME = m.Field(nameof(TableConstraint.REFERENCED_COLUMN_NAME)) // }) // .ToList(); // Console.WriteLine("", $"加载目标数据库[hdis]外键完毕:共有外键 {destConstraints.Count} 条"); // #endregion // #region 1.3 加载索引 // sql = @"SELECT TABLE_NAME, NON_UNIQUE, INDEX_NAME, COLUMN_NAME, INDEX_TYPE //FROM INFORMATION_SCHEMA.STATISTICS //WHERE TABLE_SCHEMA = '{0}' AND INDEX_NAME <> 'PRIMARY';"; // // 源数据库 // dt = MySqlHelper.ExecuteDataset(m_ConnStr, string.Format(sql, "hdis_compare")).Tables[0]; // List srcIndexes = dt // .AsEnumerable() // .Select(m => new TableIndex() // { // TABLE_NAME = m.Field(nameof(TableIndex.TABLE_NAME)), // NON_UNIQUE = m.Field(nameof(TableIndex.NON_UNIQUE)), // INDEX_NAME = m.Field(nameof(TableIndex.INDEX_NAME)), // COLUMN_NAME = m.Field(nameof(TableIndex.COLUMN_NAME)), // INDEX_TYPE = m.Field(nameof(TableIndex.INDEX_TYPE)) // }) // .ToList(); // SenConsole.WriteLinedLog("", $"加载源数据库[hdis_compare]索引完毕:共有索引 {srcConstraints.Count} 条"); // // 源数据库 // dt = MySqlHelper.ExecuteDataset(m_ConnStr, string.Format(sql, "hdis")).Tables[0]; // List destIndexes = dt // .AsEnumerable() // .Select(m => new TableIndex() // { // TABLE_NAME = m.Field(nameof(TableIndex.TABLE_NAME)), // NON_UNIQUE = m.Field(nameof(TableIndex.NON_UNIQUE)), // INDEX_NAME = m.Field(nameof(TableIndex.INDEX_NAME)), // COLUMN_NAME = m.Field(nameof(TableIndex.COLUMN_NAME)), // INDEX_TYPE = m.Field(nameof(TableIndex.INDEX_TYPE)) // }) // .ToList(); // Console.WriteLine("", $"加载目标数据库[hdis]索引完毕:共有索引 {srcConstraints.Count} 条"); // #endregion #endregion #region step 2 比对数据库结构 Console.WriteLine("", "开始比较数据库结构"); #region 2.1 比较字段 var sExcept = srcCloumns.Except(desrcCloumns, new CompareStructureCloumnComparer()).ToList(); var dExcept = desrcCloumns.Except(srcCloumns, new CompareStructureCloumnComparer()).ToList(); var except = new List(); dExcept.ForEach(o => { bool has = false; sExcept.ForEach(p => { //具有相同的两个重复记录 if (o.TableName == p.TableName && o.ColumnName == p.ColumnName) { has = true; return; } }); if (!has) { except.Add(o); } }); except = except.Union(sExcept).ToList(); Console.WriteLine("", "字段比较完毕"); if (except.Count <= 0) { Console.WriteLine("", "数据结构完全一致"); return Ok("数据结构完全一致"); } #endregion #region 2.2 生成需要创建的表 bool b_hasConetnt = false; //sb.AppendLine("SET FOREIGN_KEY_CHECKS = 0;\r\n"); var temp = except.Select(o => o.TableName).Distinct(); Console.WriteLine("", $"字段不同数量为 {except.Count}"); var sTempNames = srcCloumns.Select(o => o.TableName); var dTempNames = desrcCloumns.Select(o => o.TableName); var createTablesNames = temp.Where(o => !dTempNames.Contains(o)).ToList(); Console.WriteLine("", $"生成需要创建的表 数量 {createTablesNames.Count}"); if (createTablesNames.Any()) { createTablesNames.ForEach(tname => { string sql1 = @$"DECLARE @TableName NVARCHAR(128) = '{tname}'; DECLARE @SQL NVARCHAR (MAX); -- 获取表的创建语句 SET @SQL = 'CREATE TABLE ' + @TableName + ' (' + CHAR (13) + CHAR (10); -- 获取列信息 SELECT @SQL = @SQL + ' ' + c.name + ' ' + t.name + CASE WHEN t.name IN ('nvarchar', 'varchar', 'char', 'nchar') THEN '(' + CASE WHEN c.max_length = -1 THEN 'max' ELSE CAST (c.max_length AS NVARCHAR (10)) END + ')' WHEN t.name IN ('decimal', 'numeric') THEN '(' + CAST (c.precision AS NVARCHAR (10)) + ', ' + CAST (c.scale AS NVARCHAR (10)) + ')' ELSE '' END + CASE WHEN c.is_nullable = 0 THEN ' NOT NULL' ELSE ' NULL' END + CASE WHEN E.definition IS NOT NULL THEN ' default ' + REPLACE ( REPLACE (CAST (E.definition AS NVARCHAR (MAX)), ')', ''), '(', '') ELSE '' END + ',' + CASE WHEN ep.value IS NOT NULL THEN ' -- ' + CAST (ep.value AS NVARCHAR (MAX)) ELSE '' END + CHAR (13) + CHAR (10) FROM sys.columns c INNER JOIN sys.types t ON c.user_type_id = t.user_type_id LEFT JOIN sys.extended_properties ep ON ep.major_id = c.object_id AND ep.minor_id = c.column_id AND ep.class = 1 LEFT JOIN sys.default_constraints E ON E.parent_object_id = c.object_id AND E.parent_column_id = c.column_id WHERE c.object_id = OBJECT_ID (@TableName); -- 移除最后一个逗号 SET @SQL = LEFT (@SQL, LEN (@SQL) - 2); -- 添加主键信息 SELECT @SQL = @SQL + CHAR (13) + CHAR (10) + ' CONSTRAINT PK_' + @TableName + ' PRIMARY KEY (' + COL_NAME (ic.object_id, ic.column_id) + ')' + CHAR (13) + CHAR (10) + ')' FROM sys.indexes i INNER JOIN sys.index_columns ic ON i.object_id = ic.object_id AND i.index_id = ic.index_id WHERE i.object_id = OBJECT_ID (@TableName) AND i.is_primary_key = 1; -- 输出生成的 SQL 语句 SELECT @SQL SQL;"; DataTable ds = DbAccess.GetDataTable(sql1); if (ds.Rows.Count > 0) { b_hasConetnt = true; sb.AppendLine($"{ds.Rows[0]["SQL"].ToString()};\r\n"); Console.WriteLine("", $"生成表[{tname}]结构语句"); } else { Console.WriteLine("", $"生成表[{tname}]结构语句异常,表不存在"); } }); Console.WriteLine("", $"生成需要创建的表完毕"); } #endregion #region 2.3 生成需要删除的表 var deleteTablesNames = temp.Where(o => !sTempNames.Contains(o)).ToList(); Console.WriteLine("", $"生成需要删除的表 数量 {deleteTablesNames.Count}"); if (deleteTablesNames.Any()) { deleteTablesNames.ForEach(tname => { b_hasConetnt = true; sb.AppendLine($"DROP TABLE {tname};\r\n"); Console.WriteLine("", $"生成表[{tname}]删除语句"); }); Console.WriteLine("", $"生成需要删除的表完毕"); } #endregion #region 2.4 生成需要修改的表 var deletedColumns = new List<(string table, string column)>(); var alterTablesNames = temp.Where(o => dTempNames.Contains(o) && sTempNames.Contains(o)).ToList(); Console.WriteLine("", $"生成需要修改的表 数量 {alterTablesNames.Count}"); if (alterTablesNames.Any()) { alterTablesNames.ForEach(o => { #region 2.4.1 创建列语句 except .Where(t => t.TableName == o && !desrcCloumns.Where(p => p.TableName == o).Select(p => p.ColumnName).ToList().Contains(t.ColumnName)) .ToList() .ForEach(t => { b_hasConetnt = true; //sb.AppendLine($"ALTER TABLE `hdis`.`{t.TableName}`" + // $" ADD COLUMN `{t.ColumnName}` {t.DataType}{GetCharacter_Set_Name(t.CharacterSet)}{GetCollate(t.Collsion)}{GetNull(t.Null)}{GetDefaultValue(t.DefaultValue, t.DataType)};\r\n"); sb.AppendLine($"ALTER TABLE [{t.TableName}] ADD [{t.ColumnName}] {t.DataType} NULL;\r\n"); //ALTER TABLE[dbo].[Ghre_StudyRule] ADD[Column_42] int NOT NULL DEFAULT 1 }); #endregion #region 2.4.2 删除列语句 except .Where(t => t.TableName == o && !srcCloumns.Where(p => p.TableName == o).Select(p => p.ColumnName).ToList().Contains(t.ColumnName)) .ToList() .ForEach(t => { if (t.ColumnName == "deleted") // 如果添加删除列 deleted,生成删除垃圾数据的语句 { sb.AppendLine($"/* 删除垃圾数据 */"); sb.AppendLine($"DELETE FROM hdis.{t.TableName} WHERE deleted = 1;"); } //string forignKey = QueryForignKeyProduct("hdis", tableName: o, colName: t.ColumnName); //string indexs = QueryIndexProduct("hdis", tableName: o, colName: t.ColumnName); //b_hasConetnt = true; //if (!string.IsNullOrEmpty(forignKey)) sb.AppendLine(forignKey); //if (!string.IsNullOrEmpty(indexs)) sb.AppendLine(indexs); sb.AppendLine($"ALTER TABLE [{t.TableName}] DROP COLUMN {t.ColumnName};\r\n"); //ALTER TABLE [dbo].[Ghre_StudyRule] DROP COLUMN [IsDeptLower] deletedColumns.Add((t.TableName, t.ColumnName)); }); #endregion #region 2.4.3 修改列语句 except .Where(t => t.TableName == o && srcCloumns.Where(p => p.TableName == o).Select(p => p.ColumnName).ToList().Contains(t.ColumnName) && desrcCloumns.Where(p => p.TableName == o).Select(p => p.ColumnName).ToList().Contains(t.ColumnName)) .ToList() .ForEach(t => { b_hasConetnt = true; var old = desrcCloumns.Where(x => x.TableName == t.TableName && x.ColumnName == t.ColumnName).FirstOrDefault(); if (old != null && old.DataType != t.DataType) { if (t.DataType == "varchar") { sb.AppendLine($"ALTER TABLE [dbo].[{t.TableName}]"); sb.AppendLine($"ALTER COLUMN [{t.ColumnName}] {t.DataType} COLLATE Chinese_PRC_CI_AS;\r\n"); } else if (t.DataType == "date" || t.DataType == "datetime" || t.DataType == "datet" || t.DataType == "bigint" || t.DataType == "int") { sb.AppendLine($"ALTER TABLE [dbo].[{t.TableName}]"); sb.AppendLine($"ALTER COLUMN [{t.ColumnName}] {t.DataType};\r\n"); } } //string renovate = RenovateNotNull("hdis", t.TableName, t.ColumnName, t.Null, t.DefaultValue, t.DataType); //sb.AppendLine(renovate); //sb.AppendLine($"ALTER TABLE `hdis`.`{t.TableName}` CHANGE `{t.ColumnName}` `{t.ColumnName}` {t.DataType}{GetCharacter_Set_Name(t.CharacterSet)}{GetCollate(t.Collsion)}{GetNull(t.Null)}{GetDefaultValue(t.DefaultValue, t.DataType)};\r\n"); }); #endregion }); Console.WriteLine("", $"生成需要删除的表完毕"); } else { Console.WriteLine("", $"没有需要修改的表"); } #endregion #region 2.5 外键 //int newConstraintCount = 0; //foreach (var constraint in srcConstraints) //{ // if (createTablesNames.Contains(constraint.TABLE_NAME)) // { // continue; // } // if (deletedColumns.Contains((constraint.TABLE_NAME, constraint.COLUMN_NAME))) // { // continue; // } // if (!destConstraints.Any(x => x.CONSTRAINT_NAME == constraint.CONSTRAINT_NAME // && x.TABLE_NAME == constraint.TABLE_NAME && x.COLUMN_NAME == constraint.COLUMN_NAME // && x.REFERENCED_TABLE_NAME == constraint.REFERENCED_TABLE_NAME && x.REFERENCED_COLUMN_NAME == constraint.REFERENCED_COLUMN_NAME)) // { // newConstraintCount++; // sb.AppendLine($"ALTER TABLE `hdis`.`{constraint.TABLE_NAME}` ADD CONSTRAINT `{constraint.CONSTRAINT_NAME}` FOREIGN KEY(`{constraint.COLUMN_NAME}`) REFERENCES `{constraint.REFERENCED_TABLE_NAME}` (`{constraint.REFERENCED_COLUMN_NAME}`);"); // } //} //if (newConstraintCount > 0) //{ // b_hasConetnt = true; // Console.WriteLine("", $"生成需要添加的外键 数量 {newConstraintCount}"); // sb.AppendLine(); //} //else //{ // Console.WriteLine("", $"没有需要添加的外键"); //} //int removeConstraintCount = 0; //foreach (var constraint in destConstraints) //{ // if (deletedColumns.Contains((constraint.TABLE_NAME, constraint.COLUMN_NAME))) // { // continue; // } // if (!srcConstraints.Any(x => x.CONSTRAINT_NAME == constraint.CONSTRAINT_NAME // && x.TABLE_NAME == constraint.TABLE_NAME && x.COLUMN_NAME == constraint.COLUMN_NAME // && x.REFERENCED_TABLE_NAME == constraint.REFERENCED_TABLE_NAME && x.REFERENCED_COLUMN_NAME == constraint.REFERENCED_COLUMN_NAME)) // { // removeConstraintCount++; // sb.AppendLine($"ALTER TABLE `hdis`.`{constraint.TABLE_NAME}` DROP FOREIGN KEY `{constraint.CONSTRAINT_NAME}`;"); // } //} //if (removeConstraintCount > 0) //{ // b_hasConetnt = true; // Console.WriteLine("", $"生成需要删除的外键 数量 {removeConstraintCount}"); // sb.AppendLine(); //} //else //{ // Console.WriteLine("", $"没有需要删除的外键"); //} //lock (m_LockProgressBar) //{ // m_PBValue = 5; //} #endregion #region 2.6 索引 //int newIndexCount = 0; //foreach (var index in srcIndexes) //{ // if (createTablesNames.Contains(index.TABLE_NAME)) // { // continue; // } // if (deletedColumns.Contains((index.TABLE_NAME, index.COLUMN_NAME))) // { // continue; // } // if (!destIndexes.Any(x => x.INDEX_NAME == index.INDEX_NAME // && x.TABLE_NAME == index.TABLE_NAME && x.COLUMN_NAME == index.COLUMN_NAME // && x.NON_UNIQUE == index.NON_UNIQUE && x.INDEX_TYPE == index.INDEX_TYPE)) // { // newIndexCount++; // if (index.NON_UNIQUE == 0) // { // sb.AppendLine($"ALTER TABLE `hdis`.`{index.TABLE_NAME}` ADD UNIQUE INDEX `{index.INDEX_NAME}` (`{index.COLUMN_NAME}`);"); // } // else if (index.INDEX_TYPE == "FULLTEXT") // { // sb.AppendLine($"ALTER TABLE `hdis`.`{index.TABLE_NAME}` ADD FULLTEXT INDEX `{index.INDEX_NAME}` (`{index.COLUMN_NAME}`) USING {index.INDEX_TYPE};"); // } // else if (index.INDEX_TYPE == "SPATIAL") // { // sb.AppendLine($"ALTER TABLE `hdis`.`{index.TABLE_NAME}` ADD SPATIAL INDEX `{index.INDEX_NAME}` (`{index.COLUMN_NAME}`) USING {index.INDEX_TYPE};"); // } // else // { // sb.AppendLine($"ALTER TABLE `hdis`.`{index.TABLE_NAME}` ADD INDEX `{index.INDEX_NAME}` (`{index.COLUMN_NAME}`) USING {index.INDEX_TYPE};"); // } // } //} //if (newIndexCount > 0) //{ // b_hasConetnt = true; // Console.WriteLine("", $"生成需要添加的索引 数量 {newIndexCount}"); // sb.AppendLine(); //} //else //{ // Console.WriteLine("", $"没有需要添加的索引"); //} //int removeIndexCount = 0; //foreach (var index in destIndexes) //{ // if (deletedColumns.Contains((index.TABLE_NAME, index.COLUMN_NAME))) // { // continue; // } // if (!srcIndexes.Any(x => x.INDEX_NAME == index.INDEX_NAME // && x.TABLE_NAME == index.TABLE_NAME && x.COLUMN_NAME == index.COLUMN_NAME // && x.NON_UNIQUE == index.NON_UNIQUE && x.INDEX_TYPE == index.INDEX_TYPE)) // { // removeIndexCount++; // sb.AppendLine($"ALTER TABLE `hdis`.`{index.TABLE_NAME}` DROP INDEX `{index.INDEX_NAME}`;"); // } //} //if (removeIndexCount > 0) //{ // b_hasConetnt = true; // Console.WriteLine("", $"生成需要删除的索引 数量 {removeIndexCount}"); // sb.AppendLine(); //} //else //{ // Console.WriteLine("", $"没有需要删除的索引"); //} //lock (m_LockProgressBar) //{ // m_PBValue = 6; //} #endregion //sb.AppendLine("SET FOREIGN_KEY_CHECKS = 1;\r\n"); if (b_hasConetnt) { Console.WriteLine("", "比较数据库结构完毕"); } else { Console.WriteLine("", "比较数据库结构完毕,数据结构完全一致"); } #endregion FileHelper.WriteFile("C:/" + Guid.NewGuid() + ".sql", sb.ToString()); return Ok(sb.ToString()); //string sql = "SELECT * FROM FileAttachment where ID='{0}' and IsDeleted='false'"; //if (attachment != null) //{ // var fileName = attachment.FileName; // string path = "wwwroot/" + attachment.Path + fileName; // FileStream fs = new FileStream(path, FileMode.OpenOrCreate); // fs.Close(); // return File(new FileStream(path, FileMode.Open), "application/octet-stream", fileName); //} //else //{ // return Ok("无效ID"); //} } [HttpGet, AllowAnonymous, Route("Test")] public async Task Test(Guid id) { await _httpPollyHelper.DownLoad("http://120.26.205.42:3002/DataUser/ImgAth/Upload/202152216596.png", $"/files/upload/{DateTimeHelper.ConvertToSecondString1(DateTime.Now)}.png"); return Ok("Success"); } #region 表信息 /// /// 表信息 /// public class CompareStructureCloumn { /// /// 表名称 /// public string TableName { set; get; } /// /// 字段名称 /// public string ColumnName { set; get; } /// /// 数据类型 /// public string DataType { set; get; } /// /// 字符集 /// public string CharacterSet { set; get; } /// /// /// public string Collsion { set; get; } /// /// 是否为空 /// public string Null { set; get; } /// /// 默认值 /// public string DefaultValue { set; get; } /// /// 键 /// public string Key { set; get; } } #endregion #region 自定义比对器 /// /// 自定义比对器 /// public class CompareStructureCloumnComparer : IEqualityComparer { /// /// 比对规则 /// /// /// /// public bool Equals(CompareStructureCloumn x, CompareStructureCloumn y) { var b = x.TableName == y.TableName && x.ColumnName == y.ColumnName && x.CharacterSet == y.CharacterSet && (x.Collsion == y.Collsion) && x.DataType == y.DataType && x.DefaultValue == y.DefaultValue && x.Key == y.Key && x.Null == y.Null; return b; } /// /// /// /// /// public int GetHashCode(CompareStructureCloumn obj) { return obj.ToString().GetHashCode(); } } #endregion }