DatabaseTableMySqlService.cs 8.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Data.Common;
  4. using System.Linq;
  5. using System.Text;
  6. using System.Threading.Tasks;
  7. using YiSha.Data;
  8. using YiSha.Data.EF;
  9. using YiSha.Data.Repository;
  10. using YiSha.Entity;
  11. using YiSha.Entity.OrganizationManage;
  12. using YiSha.Entity.SystemManage;
  13. using YiSha.Enum;
  14. using YiSha.IService.SystemManage;
  15. using YiSha.Model.Result.SystemManage;
  16. using YiSha.Util;
  17. using YiSha.Util.Model;
  18. namespace YiSha.Service.SystemManage
  19. {
  20. public partial class DatabaseTableMySqlService : IDatabaseTableMySqlService
  21. {
  22. private IRepositoryFactory _baseRepository;
  23. public DatabaseTableMySqlService(IRepositoryFactory baseRepository)
  24. {
  25. _baseRepository = baseRepository;
  26. }
  27. #region 获取数据
  28. public async Task<List<TableInfo>> GetTableList(string tableName, DBConnectTypeEnum dbConnectType)
  29. {
  30. StringBuilder strSql = new StringBuilder();
  31. strSql.Append(@"SELECT table_name TableName FROM information_schema.tables WHERE table_schema='" + GetDatabase(dbConnectType) + "' AND table_type='base table'");
  32. IEnumerable<TableInfo> list = await _baseRepository.BaseRepository(dbConnectType).FindList<TableInfo>(strSql.ToString());
  33. if (!string.IsNullOrEmpty(tableName))
  34. {
  35. list = list.Where(p => p.TableName.Contains(tableName));
  36. }
  37. await SetTableDetail(dbConnectType, list);
  38. return list.ToList();
  39. }
  40. public async Task<List<TableInfo>> GetTablePageList(string tableName, DBConnectTypeEnum dbConnectType, Pagination pagination)
  41. {
  42. StringBuilder strSql = new StringBuilder();
  43. var parameter = new List<DbParameter>();
  44. strSql.Append(@"SELECT table_name TableName FROM information_schema.tables where table_schema='" + GetDatabase(dbConnectType) + "' and (table_type='base table' or table_type='BASE TABLE')");
  45. if (!string.IsNullOrEmpty(tableName))
  46. {
  47. strSql.Append(" AND table_name like @TableName ");
  48. parameter.Add(DbParameterExtension.CreateDbParameter("@TableName", '%' + tableName + '%', dbConnectType));
  49. }
  50. IEnumerable<TableInfo> list = await _baseRepository.BaseRepository(dbConnectType).FindList<TableInfo>(strSql.ToString(), parameter.ToArray(), pagination);
  51. await SetTableDetail(dbConnectType, list);
  52. return list.ToList();
  53. }
  54. public async Task<List<TableFieldInfo>> GetTableFieldList(string tableName, DBConnectTypeEnum dbConnectType)
  55. {
  56. StringBuilder strSql = new StringBuilder();
  57. strSql.Append(@"SELECT COLUMN_NAME TableColumn,
  58. DATA_TYPE Datatype,
  59. (CASE COLUMN_KEY WHEN 'PRI' THEN COLUMN_NAME ELSE '' END) TableIdentity,
  60. REPLACE(REPLACE(SUBSTRING(COLUMN_TYPE,LOCATE('(',COLUMN_TYPE)),'(',''),')','') FieldLength,
  61. (CASE IS_NULLABLE WHEN 'NO' THEN 'N' ELSE 'Y' END) IsNullable,
  62. IFNULL(COLUMN_DEFAULT,'') FieldDefault,
  63. COLUMN_COMMENT Remark
  64. FROM information_schema.columns WHERE table_schema='" + GetDatabase(dbConnectType) + "' AND table_name=@TableName");
  65. var parameter = new List<DbParameter>();
  66. parameter.Add(DbParameterExtension.CreateDbParameter("@TableName", tableName, dbConnectType));
  67. var list = await _baseRepository.BaseRepository(dbConnectType).FindList<TableFieldInfo>(strSql.ToString(), parameter.ToArray());
  68. return list.ToList();
  69. }
  70. #endregion
  71. #region 公有方法
  72. public async Task<bool> DatabaseBackup(string database, string backupPath, DBConnectTypeEnum dbConnectType)
  73. {
  74. string backupFile = string.Format("{0}\\{1}_{2}.bak", backupPath, database, DateTime.Now.ToString("yyyyMMddHHmmss"));
  75. string strSql = string.Format(" backup database [{0}] to disk = '{1}'", database, backupFile);
  76. var result = await _baseRepository.BaseRepository(dbConnectType).ExecuteBySql(strSql);
  77. return result > 0 ? true : false;
  78. }
  79. /// <summary>
  80. /// 仅用在YiShaAdmin框架里面,同步不同数据库之间的数据,以 MySql 为主库,同步 MySql 的数据到SqlServer和Oracle,保证各个数据库的数据是一样的
  81. /// </summary>
  82. /// <returns></returns>
  83. public async Task SyncDatabase()
  84. {
  85. #region 同步SqlServer数据库
  86. await SyncSqlServerTable<AreaEntity>();
  87. await SyncSqlServerTable<AutoJobEntity>();
  88. await SyncSqlServerTable<AutoJobLogEntity>();
  89. await SyncSqlServerTable<DataDictEntity>();
  90. await SyncSqlServerTable<DataDictDetailEntity>();
  91. await SyncSqlServerTable<DepartmentEntity>();
  92. await SyncSqlServerTable<LogLoginEntity>();
  93. await SyncSqlServerTable<MenuEntity>();
  94. await SyncSqlServerTable<MenuAuthorizeEntity>();
  95. await SyncSqlServerTable<NewsEntity>();
  96. await SyncSqlServerTable<PositionEntity>();
  97. await SyncSqlServerTable<RoleEntity>();
  98. await SyncSqlServerTable<UserEntity>();
  99. await SyncSqlServerTable<UserBelongEntity>();
  100. #endregion
  101. }
  102. private async Task SyncSqlServerTable<T>() where T : class, new()
  103. {
  104. string sqlServerConnectionString = "Server=localhost;Database=YiShaAdmin;User Id=sa;Password=123456;";
  105. IEnumerable<T> list = await _baseRepository.BaseRepository(DBConnectTypeEnum.SystemDB).FindList<T>();
  106. await new SqlServerDatabase(sqlServerConnectionString).Delete<T>(p => true);
  107. await new SqlServerDatabase(sqlServerConnectionString).Insert<T>(list);
  108. }
  109. #endregion
  110. #region 私有方法
  111. /// <summary>
  112. /// 获取所有表的主键、主键名称、记录数
  113. /// </summary>
  114. /// <param name="dbConnectType"></param>
  115. /// <param name="list"></param>
  116. /// <returns></returns>
  117. private async Task<List<TableInfo>> GetTableDetailList(DBConnectTypeEnum dbConnectType, IEnumerable<TableInfo> list)
  118. {
  119. var tableSchema = GetDatabase(dbConnectType);
  120. string strSql = @"SELECT t1.TABLE_NAME TableName,t1.TABLE_COMMENT Remark,t1.TABLE_ROWS TableCount,t2.CONSTRAINT_NAME TableKeyName,t2.column_name TableKey
  121. FROM information_schema.TABLES as t1
  122. LEFT JOIN INFORMATION_SCHEMA.`KEY_COLUMN_USAGE` as t2 on t1.TABLE_NAME = t2.TABLE_NAME
  123. WHERE t1.TABLE_SCHEMA='" + tableSchema + "' AND t2.TABLE_SCHEMA='" + tableSchema + "'";
  124. if (list != null && list.Count() > 0)
  125. {
  126. strSql += " AND t1.TABLE_NAME in(" + string.Join(",", list.Select(p => "'" + p.TableName + "'")) + ")";//生成 Where In 条件
  127. }
  128. IEnumerable<TableInfo> result = await _baseRepository.BaseRepository(dbConnectType).FindList<TableInfo>(strSql.ToString());
  129. return result.ToList();
  130. }
  131. /// <summary>
  132. /// 赋值表的主键、主键名称、记录数
  133. /// </summary>
  134. /// <param name="dbConnectType"></param>
  135. /// <param name="list"></param>
  136. private async Task SetTableDetail(DBConnectTypeEnum dbConnectType, IEnumerable<TableInfo> list)
  137. {
  138. List<TableInfo> detailList = await GetTableDetailList(dbConnectType, list);
  139. foreach (TableInfo table in list)
  140. {
  141. table.TableKey = string.Join(",", detailList.Where(p => p.TableName == table.TableName).Select(p => p.TableKey));
  142. var tableInfo = detailList.Where(p => p.TableName == table.TableName).FirstOrDefault();
  143. if (tableInfo != null)
  144. {
  145. table.TableKeyName = tableInfo.TableKeyName;
  146. table.TableCount = tableInfo.TableCount;
  147. table.Remark = tableInfo.Remark;
  148. }
  149. }
  150. }
  151. private string GetDatabase(DBConnectTypeEnum dbConnectType)
  152. {
  153. DBConnectHelper.GetInstance.GetDBConnectInfo(dbConnectType, out string dbType, out string dbConnectionString);
  154. if (dbType.ToLower() == "mysql")
  155. return HtmlHelper.Resove(dbConnectionString.ToLower(), "database=", ";");
  156. else if (dbType.ToLower() == "sqlserver")
  157. return "dbo";
  158. return "";
  159. }
  160. #endregion
  161. }
  162. }