using System.Data; using System.Dynamic; using System.Text; using JNPF.Common.Dtos.DataBase; using JNPF.Common.Enums; using JNPF.Common.Extension; using JNPF.Common.Filter; using JNPF.Common.Models; using JNPF.Common.Models.VisualDev; using JNPF.Common.Security; using JNPF.DependencyInjection; using JNPF.FriendlyException; using JNPF.Systems.Entitys.Dto.Database; using JNPF.Systems.Entitys.Model.DataBase; using JNPF.Systems.Entitys.System; using JNPF.VisualDev.Entitys.Dto.VisualDevModelData; using Mapster; using Microsoft.Extensions.Options; using SqlSugar; namespace JNPF.Common.Core.Manager; /// /// 实现切换数据库后操作. /// public class DataBaseManager : IDataBaseManager, ITransient { /// /// 初始化客户端. /// private static SqlSugarScope _sqlSugarClient; /// /// 用户管理器. /// private readonly IUserManager _userManager; /// /// 数据库配置选项. /// private readonly ConnectionStringsOptions _connectionStrings; /// /// 构造函数. /// public DataBaseManager( IOptions connectionOptions, IUserManager userManager, ISqlSugarClient context) { _sqlSugarClient = (SqlSugarScope)context; _userManager = userManager; _connectionStrings = connectionOptions.Value; } /// /// 数据库切换. /// /// 数据连接. /// 切库后的SqlSugarClient. public SqlSugarScope ChangeDataBase(DbLinkEntity link) { if (_sqlSugarClient.AsTenant().IsAnyConnection(link.Id)) { _sqlSugarClient.ChangeDatabase(link.Id); } else { _sqlSugarClient.AddConnection(new ConnectionConfig() { ConfigId = link.Id, DbType = ToDbType(link.DbType), ConnectionString = ToConnectionString(link), InitKeyType = InitKeyType.Attribute, IsAutoCloseConnection = true }); _sqlSugarClient.ChangeDatabase(link.Id); } return _sqlSugarClient; } /// /// 获取多租户Link. /// /// 租户ID. /// 租户数据库. /// public DbLinkEntity GetTenantDbLink(string tenantId, string tenantName) { return new DbLinkEntity { Id = tenantId, ServiceName = tenantName, DbType = _connectionStrings.DBType, Host = _connectionStrings.Host, Port = _connectionStrings.Port, UserName = _connectionStrings.UserName, Password = _connectionStrings.Password }; } /// /// 执行Sql(查询). /// /// 数据连接. /// sql语句. /// public async Task ExecuteSql(DbLinkEntity link, string strSql) { if (link != null && _sqlSugarClient.CurrentConnectionConfig.ConfigId != link.Id) _sqlSugarClient = ChangeDataBase(link); int flag = 0; if (_sqlSugarClient.CurrentConnectionConfig.DbType == SqlSugar.DbType.Oracle) flag = await _sqlSugarClient.Ado.ExecuteCommandAsync(strSql.TrimEnd(';')); else flag = await _sqlSugarClient.Ado.ExecuteCommandAsync(strSql); return flag; } /// /// 条件动态过滤. /// /// 数据连接. /// sql语句. /// 条件是否成立. public bool WhereDynamicFilter(DbLinkEntity link, string strSql) { if (link != null && _sqlSugarClient.CurrentConnectionConfig.ConfigId != link.Id) _sqlSugarClient = ChangeDataBase(link); return _sqlSugarClient.Ado.SqlQuery(strSql).Count > 0; } /// /// 执行Sql(新增、修改). /// /// 数据连接. /// 表名. /// 数据. /// 主键字段. /// public async Task ExecuteSql(DbLinkEntity link, string table, List> dicList, string primaryField = "") { if (link != null && _sqlSugarClient.CurrentConnectionConfig.ConfigId != link.Id) _sqlSugarClient = ChangeDataBase(link); int flag = 0; if (string.IsNullOrEmpty(primaryField)) { foreach (var item in dicList) flag = await _sqlSugarClient.Insertable(item).AS(table).ExecuteCommandAsync(); } else { foreach (var item in dicList) flag = await _sqlSugarClient.Updateable(item).AS(table).WhereColumns(primaryField).ExecuteCommandAsync(); } return flag; } /// /// 执行Sql 新增 并返回自增长Id. /// /// 数据连接. /// 表名. /// 数据. /// 主键字段. /// id. public async Task ExecuteReturnIdentityAsync(DbLinkEntity link, string table, List> dicList, string primaryField = "") { if (link != null && _sqlSugarClient.CurrentConnectionConfig.ConfigId != link.Id) _sqlSugarClient = ChangeDataBase(link); int flag = 0; if (string.IsNullOrEmpty(primaryField)) flag = await _sqlSugarClient.Insertable(dicList).AS(table).ExecuteReturnIdentityAsync(); return flag; } /// /// 创建表. /// /// 数据连接. /// 表对象. /// 字段对象. /// public async Task Create(DbLinkEntity link, DbTableModel tableModel, List tableFieldList) { if (link != null && _sqlSugarClient.CurrentConnectionConfig.ConfigId != link.Id) _sqlSugarClient = ChangeDataBase(link); CreateTable(tableModel, tableFieldList); return true; } /// /// sqlsugar添加表字段. /// /// 表名. /// 表字段集合. public void AddTableColumn(DbLinkEntity link, string tableName, List tableFieldList) { try { if (link != null && _sqlSugarClient.CurrentConnectionConfig.ConfigId != link.Id) _sqlSugarClient = ChangeDataBase(link); var cloumnList = tableFieldList.Adapt>(); DelDataLength(cloumnList); foreach (var item in cloumnList) { _sqlSugarClient.DbMaintenance.AddColumn(tableName, item); if (_sqlSugarClient.CurrentConnectionConfig.DbType != SqlSugar.DbType.MySql) _sqlSugarClient.DbMaintenance.AddColumnRemark(item.DbColumnName, tableName, item.ColumnDescription); } //if (_sqlSugarClient.CurrentConnectionConfig.DbType == SqlSugar.DbType.MySql) // AddColumnMySql(tableName, tableFieldList); } catch (Exception ex) { throw new Exception(ex.Message); } } /// /// 删除表. /// /// 数据连接. /// 表名. /// public bool Delete(DbLinkEntity link, string table) { if (link != null && _sqlSugarClient.CurrentConnectionConfig.ConfigId != link.Id) _sqlSugarClient = ChangeDataBase(link); try { _sqlSugarClient.DbMaintenance.DropTable(table); return true; } catch (Exception) { throw; } } /// /// 修改表. /// /// 数据连接. /// 原数据. /// 表对象. /// 字段对象. /// public async Task Update(DbLinkEntity link, string oldTable, DbTableModel tableModel, List tableFieldList) { if (link != null && _sqlSugarClient.CurrentConnectionConfig.ConfigId != link.Id) _sqlSugarClient = ChangeDataBase(link); _sqlSugarClient.DbMaintenance.DropTable(oldTable); try { CreateTable(tableModel, tableFieldList); } catch (Exception ex) { return false; } return true; } /// /// 根据链接获取分页数据. /// /// public PageResult> GetInterFaceData(DbLinkEntity link, string strSql, VisualDevModelListQueryInput pageInput, MainBeltViceQueryModel columnDesign, List dataPermissions, Dictionary outColumnName = null) { if (link != null && _sqlSugarClient.CurrentConnectionConfig.ConfigId != link.Id) _sqlSugarClient = ChangeDataBase(link); try { int total = 0; if (_sqlSugarClient.CurrentConnectionConfig.DbType == SqlSugar.DbType.Oracle) strSql = strSql.Replace(";", string.Empty); var sidx = pageInput.sidx.IsNotEmptyOrNull() && pageInput.sort.IsNotEmptyOrNull(); // 按前端参数排序 var defaultSidx = columnDesign.defaultSidx.IsNotEmptyOrNull() && columnDesign.sort.IsNotEmptyOrNull(); // 按模板默认排序 var querJson = new List(); if (pageInput.queryJson.IsNotEmptyOrNull()) querJson = _sqlSugarClient.Utilities.JsonToConditionalModels(pageInput.queryJson); var superQueryJson = new List(); if (pageInput.superQueryJson.IsNotEmptyOrNull()) superQueryJson = _sqlSugarClient.Utilities.JsonToConditionalModels(pageInput.superQueryJson); // var sql = _sqlSugarClient.SqlQueryable(strSql) // .Where(querJson).Where(superQueryJson).Where(dataPermissions).ToSqlString(); DataTable dt = _sqlSugarClient.SqlQueryable(strSql) .Where(querJson).Where(superQueryJson).Where(dataPermissions) .OrderByIF(sidx, pageInput.sidx + " " + pageInput.sort).OrderByIF(!sidx && defaultSidx, columnDesign.defaultSidx + " " + columnDesign.sort) .ToDataTablePage(pageInput.currentPage, pageInput.pageSize, ref total); // 如果有字段别名 替换 ColumnName if (outColumnName != null && outColumnName.Count > 0) { var resultKey = string.Empty; for (var i = 0; i < dt.Columns.Count; i++) dt.Columns[i].ColumnName = outColumnName.TryGetValue(dt.Columns[i].ColumnName.ToUpper(), out resultKey) == true ? outColumnName[dt.Columns[i].ColumnName.ToUpper()] : dt.Columns[i].ColumnName.ToUpper(); } return new PageResult>() { pagination = new PageResult() { currentPage = pageInput.currentPage, pageSize = pageInput.pageSize, total = total }, list = dt.ToObject>>().ToObject>>() }; } catch (Exception ex) { throw; } } /// /// 表是否存在. /// /// 数据连接. /// 表名. /// public bool IsAnyTable(DbLinkEntity link, string table) { if (link != null && _sqlSugarClient.CurrentConnectionConfig.ConfigId != link.Id) _sqlSugarClient = ChangeDataBase(link); return _sqlSugarClient.DbMaintenance.IsAnyTable(table, false); } /// /// 表字段是否存在. /// /// 数据连接. /// 表名. /// 表字段名. /// public bool IsAnyColumn(DbLinkEntity link, string table, string column) { if (link != null && _sqlSugarClient.CurrentConnectionConfig.ConfigId != link.Id) _sqlSugarClient = ChangeDataBase(link); return _sqlSugarClient.DbMaintenance.IsAnyColumn(table, column, false); } /// /// 获取表字段列表. /// /// 数据连接. /// 表名. /// TableFieldListModel. public List GetFieldList(DbLinkEntity? link, string? tableName) { if (link != null && _sqlSugarClient.CurrentConnectionConfig.ConfigId != link.Id) _sqlSugarClient = ChangeDataBase(link); var list = _sqlSugarClient.DbMaintenance.GetColumnInfosByTableName(tableName, false); return list.Adapt>(); } /// /// 获取表数据. /// /// 数据连接. /// 表名. /// public DataTable GetData(DbLinkEntity link, string tableName) { if (link != null && _sqlSugarClient.CurrentConnectionConfig.ConfigId != link.Id) _sqlSugarClient = ChangeDataBase(link); return _sqlSugarClient.Queryable().AS(tableName).ToDataTable(); } /// /// 根据链接获取数据. /// /// 数据连接. /// sql语句. /// 参数. /// public DataTable GetInterFaceData(DbLinkEntity link, string strSql, params SugarParameter[] parameters) { try { if (link != null && _sqlSugarClient.CurrentConnectionConfig.ConfigId != link.Id) _sqlSugarClient = ChangeDataBase(link); if (_sqlSugarClient.CurrentConnectionConfig.DbType == SqlSugar.DbType.Oracle) strSql = strSql.Replace(";", string.Empty); return _sqlSugarClient.Ado.GetDataTable(strSql, parameters); } catch (Exception) { throw Oops.Oh(ErrorCode.D1511); } } /// /// 执行增删改sql. /// /// 数据连接. /// sql语句. /// 参数. public void ExecuteCommand(DbLinkEntity link, string strSql, params SugarParameter[] parameters) { if (link != null && _sqlSugarClient.CurrentConnectionConfig.ConfigId != link.Id) _sqlSugarClient = ChangeDataBase(link); if (_sqlSugarClient.CurrentConnectionConfig.DbType == SqlSugar.DbType.Oracle) strSql = strSql.Replace(";", string.Empty); _sqlSugarClient.Ado.ExecuteCommand(strSql, parameters); } /// /// 获取表信息. /// /// 数据连接. /// 表名. /// public DatabaseTableInfoOutput GetDataBaseTableInfo(DbLinkEntity link, string tableName) { if (link != null && _sqlSugarClient.CurrentConnectionConfig.ConfigId != link.Id) _sqlSugarClient = ChangeDataBase(link); var data = new DatabaseTableInfoOutput() { tableInfo = _sqlSugarClient.DbMaintenance.GetTableInfoList(false).Find(m => m.Name == tableName).Adapt(), tableFieldList = _sqlSugarClient.DbMaintenance.GetColumnInfosByTableName(tableName, false).Adapt>() }; data.tableFieldList = ViewDataTypeConversion(data.tableFieldList, _sqlSugarClient.CurrentConnectionConfig.DbType); return data; } /// /// 获取数据库表信息. /// /// 数据连接. /// public List GetDBTableList(DbLinkEntity link) { if (link != null && _sqlSugarClient.CurrentConnectionConfig.ConfigId != link.Id) _sqlSugarClient = ChangeDataBase(link); var dbType = link.DbType; var sql = DBTableSql(dbType); var modelList = _sqlSugarClient.Ado.SqlQuery(sql).ToList(); return modelList.Select(x => new DatabaseTableListOutput { table = x.F_TABLE, tableName = x.F_TABLENAME, sum = x.F_SUM.ParseToInt() }).ToList(); //return modelList.Adapt>(); } /// /// 获取数据库表信息. /// /// 数据连接. /// public List GetTableInfos(DbLinkEntity link) { if (link != null && _sqlSugarClient.CurrentConnectionConfig.ConfigId != link.Id) _sqlSugarClient = ChangeDataBase(link); return _sqlSugarClient.DbMaintenance.GetTableInfoList(false); } /// /// 获取数据表分页(SQL语句). /// /// 数据连接. /// 数据SQL. /// 页数. /// 条数. /// public async Task GetDataTablePage(DbLinkEntity link, string dbSql, int pageIndex, int pageSize) { if (link != null && _sqlSugarClient.CurrentConnectionConfig.ConfigId != link.Id) _sqlSugarClient = ChangeDataBase(link); RefAsync totalNumber = 0; var list = await _sqlSugarClient.SqlQueryable(dbSql).ToDataTablePageAsync(pageIndex, pageSize, totalNumber); return PageResult.SqlSugarPageResult(new SqlSugarPagedList() { list = ToDynamicList(list), pagination = new Pagination() { CurrentPage = pageIndex, PageSize = pageSize, Total = totalNumber } }); } /// /// 获取数据表分页(实体). /// /// T. /// 数据连接. /// 页数. /// 条数. /// public async Task> GetDataTablePage(DbLinkEntity link, int pageIndex, int pageSize) { if (link != null && _sqlSugarClient.CurrentConnectionConfig.ConfigId != link.Id) _sqlSugarClient = ChangeDataBase(link); return await _sqlSugarClient.Queryable().ToPageListAsync(pageIndex, pageSize); } /// /// 同步数据. /// /// 数据连接. /// 同步数据. /// 表. /// public async Task SyncData(DbLinkEntity link, DataTable dt, string table) { if (link != null && _sqlSugarClient.CurrentConnectionConfig.ConfigId != link.Id) _sqlSugarClient = ChangeDataBase(link); List> dc = _sqlSugarClient.Utilities.DataTableToDictionaryList(dt); // 5.0.23版本支持 var isOk = await _sqlSugarClient.Insertable(dc).AS(table).ExecuteCommandAsync(); return isOk > 0; } /// /// 同步表操作. /// /// 原数据库. /// 目前数据库. /// 表名称. /// 操作类型. /// 数据类型. public void SyncTable(DbLinkEntity linkFrom, DbLinkEntity linkTo, string table, int type, Dictionary fieldType) { try { switch (type) { case 2: { if (linkFrom != null) _sqlSugarClient = ChangeDataBase(linkFrom); var columns = _sqlSugarClient.DbMaintenance.GetColumnInfosByTableName(table, false); if (linkTo != null) _sqlSugarClient = ChangeDataBase(linkTo); DelDataLength(columns, fieldType); _sqlSugarClient.DbMaintenance.CreateTable(table, columns); } break; case 3: { if (linkTo != null) _sqlSugarClient = ChangeDataBase(linkTo); _sqlSugarClient.DbMaintenance.TruncateTable(table); } break; } } catch (Exception ex) { throw; } } /// /// 使用存储过程. /// /// 数据连接. /// 存储过程名称. /// 参数. public void UseStoredProcedure(DbLinkEntity link, string stored, List parameters) { if (link != null && _sqlSugarClient.CurrentConnectionConfig.ConfigId != link.Id) _sqlSugarClient = ChangeDataBase(link); _sqlSugarClient.Ado.UseStoredProcedure().GetDataTable(stored, parameters); } /// /// 测试数据库连接. /// /// 数据连接. /// public bool IsConnection(DbLinkEntity link) { if (link != null && _sqlSugarClient.CurrentConnectionConfig.ConfigId != link.Id) _sqlSugarClient = ChangeDataBase(link); if (_sqlSugarClient.Ado.IsValidConnection()) return true; else return false; } /// /// 视图数据类型转换. /// /// 字段数据. /// 数据库类型. public List ViewDataTypeConversion(List fields, SqlSugar.DbType databaseType) { foreach (var item in fields) { item.dataType = item.dataType.ToLower(); switch (item.dataType) { case "string": { item.dataType = "varchar"; if (item.dataLength.ParseToInt() > 2000) { item.dataType = "text"; item.dataLength = "50"; } } break; case "single": item.dataType = "decimal"; break; } } return fields; } /// /// 转换数据库类型. /// /// 数据库类型. /// public SqlSugar.DbType ToDbType(string dbType) { switch (dbType.ToLower()) { case "sqlserver": return SqlSugar.DbType.SqlServer; case "mysql": return SqlSugar.DbType.MySql; case "oracle": return SqlSugar.DbType.Oracle; case "dm8": case "dm": return SqlSugar.DbType.Dm; case "kdbndp": case "kingbasees": return SqlSugar.DbType.Kdbndp; case "postgresql": return SqlSugar.DbType.PostgreSQL; default: throw Oops.Oh(ErrorCode.D1505); } } /// /// 转换连接字符串. /// /// 数据连接. /// public string ToConnectionString(DbLinkEntity dbLinkEntity) { switch (dbLinkEntity.DbType.ToLower()) { case "sqlserver": return string.Format("Data Source={0},{4};Initial Catalog={1};User ID={2};Password={3};MultipleActiveResultSets=true", dbLinkEntity.Host, dbLinkEntity.ServiceName, dbLinkEntity.UserName, dbLinkEntity.Password, dbLinkEntity.Port); case "oracle": var oracleParam = dbLinkEntity.OracleParam.ToObject(); return string.Format("Data Source=(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST={0})(PORT={1}))(CONNECT_DATA=(SERVER = DEDICATED)(SERVICE_NAME={2})));User Id={3};Password={4}", dbLinkEntity.Host, dbLinkEntity.Port.ToString(), oracleParam.oracleService, dbLinkEntity.UserName, dbLinkEntity.Password); case "mysql": return string.Format("server={0};port={1};database={2};user={3};password={4};AllowLoadLocalInfile=true", dbLinkEntity.Host, dbLinkEntity.Port.ToString(), dbLinkEntity.ServiceName, dbLinkEntity.UserName, dbLinkEntity.Password); case "dm8": case "dm": return string.Format("server={0};port={1};database={2};User Id={3};PWD={4}", dbLinkEntity.Host, dbLinkEntity.Port.ToString(), dbLinkEntity.ServiceName, dbLinkEntity.UserName, dbLinkEntity.Password); case "kdbndp": case "kingbasees": return string.Format("server={0};port={1};database={2};UID={3};PWD={4}", dbLinkEntity.Host, dbLinkEntity.Port.ToString(), dbLinkEntity.ServiceName, dbLinkEntity.UserName, dbLinkEntity.Password); case "postgresql": return string.Format("server={0};port={1};Database={2};User Id={3};Password={4}", dbLinkEntity.Host, dbLinkEntity.Port.ToString(), dbLinkEntity.ServiceName, dbLinkEntity.UserName, dbLinkEntity.Password); default: throw Oops.Oh(ErrorCode.D1505); } } /// /// DataTable转DicList. /// /// /// private List> DataTableToDicList(DataTable dt) { return dt.AsEnumerable().Select(row => dt.Columns.Cast().ToDictionary(column => column.ColumnName.ToLower(), column => row[column])).ToList(); } /// /// 将DataTable 转换成 List /// reverse 反转:控制返回结果中是只存在 FilterField 指定的字段,还是排除. /// [flase 返回FilterField 指定的字段]|[true 返回结果剔除 FilterField 指定的字段] /// FilterField 字段过滤,FilterField 为空 忽略 reverse 参数;返回DataTable中的全部数 /// /// DataTable /// /// 反转:控制返回结果中是只存在 FilterField 指定的字段,还是排除. /// [flase 返回FilterField 指定的字段]|[true 返回结果剔除 FilterField 指定的字段] /// /// 字段过滤,FilterField 为空 忽略 reverse 参数;返回DataTable中的全部数据 /// List public static List ToDynamicList(DataTable table, bool reverse = true, params string[] FilterField) { var modelList = new List(); foreach (DataRow row in table.Rows) { dynamic model = new ExpandoObject(); var dict = (IDictionary)model; foreach (DataColumn column in table.Columns) { if (FilterField.Length != 0) { if (reverse) { if (!FilterField.Contains(column.ColumnName)) { dict[column.ColumnName] = row[column]; } } else { if (FilterField.Contains(column.ColumnName)) { dict[column.ColumnName] = row[column]; } } } else { dict[column.ColumnName.ToLower()] = row[column]; } } modelList.Add(model); } return modelList; } /// /// 数据库表SQL. /// /// 数据库类型. /// private string DBTableSql(string dbType) { StringBuilder sb = new StringBuilder(); switch (dbType.ToLower()) { case "sqlserver": //sb.Append(@"DECLARE @TABLEINFO TABLE ( NAME VARCHAR(50) , SUMROWS VARCHAR(11) , RESERVED VARCHAR(50) , DATA VARCHAR(50) , INDEX_SIZE VARCHAR(50) , UNUSED VARCHAR(50) , PK VARCHAR(50) ) DECLARE @TABLENAME TABLE ( NAME VARCHAR(50) ) DECLARE @NAME VARCHAR(50) DECLARE @PK VARCHAR(50) INSERT INTO @TABLENAME ( NAME ) SELECT O.NAME FROM SYSOBJECTS O , SYSINDEXES I WHERE O.ID = I.ID AND O.XTYPE = 'U' AND I.INDID < 2 ORDER BY I.ROWS DESC , O.NAME WHILE EXISTS ( SELECT 1 FROM @TABLENAME ) BEGIN SELECT TOP 1 @NAME = NAME FROM @TABLENAME DELETE @TABLENAME WHERE NAME = @NAME DECLARE @OBJECTID INT SET @OBJECTID = OBJECT_ID(@NAME) SELECT @PK = COL_NAME(@OBJECTID, COLID) FROM SYSOBJECTS AS O INNER JOIN SYSINDEXES AS I ON I.NAME = O.NAME INNER JOIN SYSINDEXKEYS AS K ON K.INDID = I.INDID WHERE O.XTYPE = 'PK' AND PARENT_OBJ = @OBJECTID AND K.ID = @OBJECTID INSERT INTO @TABLEINFO ( NAME , SUMROWS , RESERVED , DATA , INDEX_SIZE , UNUSED ) EXEC SYS.SP_SPACEUSED @NAME UPDATE @TABLEINFO SET PK = @PK WHERE NAME = @NAME END SELECT F.NAME AS F_TABLE,ISNULL(P.TDESCRIPTION,F.NAME) AS F_TABLENAME, F.RESERVED AS F_SIZE, RTRIM(F.SUMROWS) AS F_SUM, F.PK AS F_PRIMARYKEY FROM @TABLEINFO F LEFT JOIN ( SELECT NAME = CASE WHEN A.COLORDER = 1 THEN D.NAME ELSE '' END , TDESCRIPTION = CASE WHEN A.COLORDER = 1 THEN ISNULL(F.VALUE, '') ELSE '' END FROM SYSCOLUMNS A LEFT JOIN SYSTYPES B ON A.XUSERTYPE = B.XUSERTYPE INNER JOIN SYSOBJECTS D ON A.ID = D.ID AND D.XTYPE = 'U' AND D.NAME <> 'DTPROPERTIES' LEFT JOIN SYS.EXTENDED_PROPERTIES F ON D.ID = F.MAJOR_ID WHERE A.COLORDER = 1 AND F.MINOR_ID = 0 ) P ON F.NAME = P.NAME WHERE 1 = 1 ORDER BY F_TABLE"); sb.Append(@"SELECT s.Name F_TABLE, Convert(nvarchar(max), tbp.value) as F_TABLENAME, b.ROWS F_SUM FROM sysobjects s LEFT JOIN sys.extended_properties as tbp ON s.id = tbp.major_id and tbp.minor_id = 0 AND ( tbp.Name = 'MS_Description' OR tbp.Name is null ) LEFT JOIN sysindexes AS b ON s.id = b.id WHERE s.xtype IN('U') AND (b.indid IN (0, 1))"); break; case "oracle": //sb.Append(@"SELECT DISTINCT COL.TABLE_NAME AS F_TABLE,TAB.COMMENTS AS F_TABLENAME,0 AS F_SIZE,NVL(T.NUM_ROWS,0)AS F_SUM,COLUMN_NAME AS F_PRIMARYKEY FROM USER_CONS_COLUMNS COL INNER JOIN USER_CONSTRAINTS CON ON CON.CONSTRAINT_NAME=COL.CONSTRAINT_NAME INNER JOIN USER_TAB_COMMENTS TAB ON TAB.TABLE_NAME=COL.TABLE_NAME INNER JOIN USER_TABLES T ON T.TABLE_NAME=COL.TABLE_NAME WHERE CON.CONSTRAINT_TYPE NOT IN('C','R')ORDER BY COL.TABLE_NAME"); sb.Append(@"SELECT table_name F_TABLE , (select COMMENTS from user_tab_comments where t.table_name=table_name ) as F_TABLENAME, T.NUM_ROWS F_SUM from user_tables t where table_name!='HELP' AND table_name NOT LIKE '%$%' AND table_name NOT LIKE 'LOGMNRC_%' AND table_name!='LOGMNRP_CTAS_PART_MAP' AND table_name!='LOGMNR_LOGMNR_BUILDLOG' AND table_name!='SQLPLUS_PRODUCT_PROFILE'"); break; case "mysql": //sb.Append(@"SELECT T1.*,(SELECT COLUMN_NAME FROM INFORMATION_SCHEMA.`COLUMNS`WHERE TABLE_SCHEMA=DATABASE()AND TABLE_NAME=T1.F_TABLE AND COLUMN_KEY='PRI')F_PRIMARYKEY FROM(SELECT TABLE_NAME F_TABLE,0 F_SIZE,TABLE_ROWS F_SUM,(SELECT IF(LENGTH(TRIM(TABLE_COMMENT))<1,TABLE_NAME,TABLE_COMMENT))F_TABLENAME FROM INFORMATION_SCHEMA.`TABLES`WHERE TABLE_SCHEMA=DATABASE())T1 ORDER BY T1.F_TABLE"); sb.Append(@"select TABLE_NAME as F_TABLE,TABLE_ROWS as F_SUM ,TABLE_COMMENT as F_TABLENAME from information_schema.tables where TABLE_SCHEMA=(select database()) AND TABLE_TYPE='BASE TABLE'"); break; case "dm8": case "dm": sb.Append(@"SELECT table_name F_TABLE , (select COMMENTS from user_tab_comments where t.table_name=table_name ) as F_TABLENAME, T.NUM_ROWS F_SUM from user_tables t where table_name!='HELP' AND table_name NOT LIKE '%$%' AND table_name NOT LIKE 'LOGMNRC_%' AND table_name!='LOGMNRP_CTAS_PART_MAP' AND table_name!='LOGMNR_LOGMNR_BUILDLOG' AND table_name!='SQLPLUS_PRODUCT_PROFILE'"); break; case "kdbndp": case "kingbasees": sb.Append(@"select a.relname F_TABLE,a.n_live_tup F_SUM,b.description F_TABLENAME from sys_stat_user_tables a left outer join sys_description b on a.relid = b.objoid where a.schemaname='public' and b.objsubid='0'"); break; case "postgresql": sb.Append(@"select cast(relname as varchar) as F_TABLE, cast(reltuples as varchar) as F_SUM, cast(obj_description(relfilenode,'pg_class') as varchar) as F_TABLENAME from pg_class c inner join pg_namespace n on n.oid = c.relnamespace and nspname='public' inner join pg_tables z on z.tablename=c.relname where relkind = 'r' and relname not like 'pg_%' and relname not like 'sql_%' and schemaname='public' order by relname"); break; default: throw new Exception("不支持"); } return sb.ToString(); } /// /// MySql创建表单+注释. /// /// 表. /// 字段. private async Task CreateTableMySql(DbTableModel tableModel, List tableFieldList) { StringBuilder strSql = new StringBuilder(); strSql.Append("CREATE TABLE `" + tableModel.table + "` (\r\n"); foreach (var item in tableFieldList) { if (item.primaryKey && item.allowNull == 1) throw Oops.Oh(ErrorCode.D1509); strSql.Append(" `" + item.field + "` " + item.dataType.ToUpper() + ""); if (item.dataType == "varchar" || item.dataType == "nvarchar" || item.dataType == "decimal") strSql.Append(" (" + item.dataLength + ") "); if (item.primaryKey) strSql.Append(" primary key "); if (item.allowNull != 1) strSql.Append(" NOT NULL "); else strSql.Append(" NULL "); if(item.identity) strSql.Append(" AUTO_INCREMENT "); strSql.Append("COMMENT '" + item.fieldName + "'"); strSql.Append(","); } strSql.Remove(strSql.Length - 1, 1); strSql.Append("\r\n"); strSql.Append(") COMMENT = '" + tableModel.tableName + "';"); await _sqlSugarClient.Ado.ExecuteCommandAsync(strSql.ToString()); } /// /// MySql创建表单+注释. /// /// 表. /// 字段. private void AddColumnMySql(string table, List tableFieldList) { StringBuilder strSql = new StringBuilder(); foreach (var item in tableFieldList) { if (item.dataType == "varchar" || item.dataType == "nvarchar" || item.dataType == "decimal") strSql.AppendFormat("ALTER TABLE {0} MODIFY {1} {2}({3}) COMMENT '{4}';", table, item.field, item.dataType, item.dataLength, item.fieldName); else strSql.AppendFormat("ALTER TABLE {0} MODIFY {1} {2} COMMENT '{3}';", table, item.field, item.dataType, item.fieldName); } _sqlSugarClient.Ado.ExecuteCommand(strSql.ToString()); } /// /// sqlsugar建表. /// /// 表. /// 字段. private void CreateTable(DbTableModel tableModel, List tableFieldList) { var cloumnList = tableFieldList.Adapt>(); DelDataLength(cloumnList); var isOk = _sqlSugarClient.DbMaintenance.CreateTable(tableModel.table, cloumnList); _sqlSugarClient.DbMaintenance.AddTableRemark(tableModel.table, tableModel.tableName); //mysql不需要单独添加字段注释 if (_sqlSugarClient.CurrentConnectionConfig.DbType != SqlSugar.DbType.MySql) { foreach (var item in cloumnList) { _sqlSugarClient.DbMaintenance.AddColumnRemark(item.DbColumnName, tableModel.table, item.ColumnDescription); } } } /// /// 删除列长度(SqlSugar除了字符串其他不需要类型长度). /// /// private void DelDataLength(List dbColumnInfos, Dictionary dataTypeDic = null) { foreach (var item in dbColumnInfos) { if (item.DataType.ToLower() != "varchar") item.Length = 0; if (item.DataType.ToLower() != "varchar") item.DecimalDigits = 0; if (dataTypeDic == null) { item.DataType = DataTypeConversion(item.DataType.ToLower(), _sqlSugarClient.CurrentConnectionConfig.DbType); } else { if (dataTypeDic.ContainsKey(item.DataType.ToLower())) { item.DataType = dataTypeDic[item.DataType.ToLower().Replace("(默认)",string.Empty)]; } } } } /// /// 数据库数据类型转换. /// /// 数据类型. /// 数据库类型 /// private string DataTypeConversion(string dataType, SqlSugar.DbType databaseType) { if (databaseType.Equals(SqlSugar.DbType.Oracle)) { switch (dataType) { case "text": return "CLOB"; case "decimal": return "DECIMAL(38,38)"; case "datetime": return "DATE"; case "bigint": return "NUMBER"; default: return dataType.ToUpper(); } } else if (databaseType.Equals(SqlSugar.DbType.Dm)) { return dataType.ToUpper(); } else if (databaseType.Equals(SqlSugar.DbType.Kdbndp)) { switch (dataType) { case "int": return "NUMBER"; case "datetime": return "DATE"; case "bigint": return "INT8"; default: return dataType.ToUpper(); } } else if (databaseType.Equals(SqlSugar.DbType.PostgreSQL)) { switch (dataType) { case "varchar": return "varchar"; case "int": return "INT4"; case "datetime": return "timestamp"; case "decimal": return "DECIMAL"; case "bigint": return "INT8"; case "text": return "TEXT"; default: return dataType; } } else { return dataType; } } }