From f9e3a01602c5a0542b7587f265119e26e6b5a3a6 Mon Sep 17 00:00:00 2001 From: pofi Date: Tue, 28 Mar 2023 18:04:15 +0800 Subject: [PATCH] =?UTF-8?q?=E5=88=87=E6=8D=A2=E6=95=B0=E6=8D=AE=E5=BA=93?= =?UTF-8?q?=E6=97=B6=E6=89=93=E5=8D=B0sql=EF=BC=8C=E5=A2=9E=E5=8A=A0?= =?UTF-8?q?=E8=8E=B7=E5=8F=96=E4=B8=BB=E9=94=AE=E7=9A=84=E6=8E=A5=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Extensions/ConfigureSqlSugarExtensions.cs | 34 +- .../Manager/DataBase/DataBaseManager.cs | 1799 +++++++++-------- .../Manager/DataBase/IDataBaseManager.cs | 438 ++-- .../Repositories/SqlSugarRepository.cs | 1 - visualdev/Tnb.VisualDev/RunService.cs | 11 +- 5 files changed, 1161 insertions(+), 1122 deletions(-) diff --git a/apihost/Tnb.API.Entry/Extensions/ConfigureSqlSugarExtensions.cs b/apihost/Tnb.API.Entry/Extensions/ConfigureSqlSugarExtensions.cs index 31dc6bbd..667f28ee 100644 --- a/apihost/Tnb.API.Entry/Extensions/ConfigureSqlSugarExtensions.cs +++ b/apihost/Tnb.API.Entry/Extensions/ConfigureSqlSugarExtensions.cs @@ -42,26 +42,24 @@ public static class ConfigureSqlSugarExtensions // // 设置超时时间 // db.Ado.CommandTimeOut = 30; - - // // 打印SQL语句 - // db.Aop.OnLogExecuting = (sql, pars) => + // db.Aop.OnLogExecuted = (sql, pars) => + // { + // var oldColor = Console.ForegroundColor; + // Console.ForegroundColor = ConsoleColor.Green; + // var finalSql = UtilMethods.GetSqlString(db.CurrentConnectionConfig.DbType, sql, pars); + // Console.WriteLine($"【{DateTime.Now.ToString("HH:mm:ss.fff")}——SQL执行完成】{db.Ado.SqlExecutionTime.TotalMilliseconds} ms"); + // Console.WriteLine(finalSql); + // Console.ForegroundColor = oldColor; + // if (db.Ado.SqlExecutionTime.TotalMilliseconds > 3000) // { - // var oldColor = Console.ForegroundColor; - // Console.ForegroundColor = ConsoleColor.Green; - // var finalSql = UtilMethods.GetSqlString(db.CurrentConnectionConfig.DbType, sql, pars); - // Console.WriteLine($"【{DateTime.Now.ToString("HH:mm:ss.fff")}——SQL执行完成】{db.Ado.SqlExecutionTime.TotalMilliseconds} ms"); - // Console.WriteLine(finalSql); - // Console.ForegroundColor = oldColor; - // if (db.Ado.SqlExecutionTime.TotalMilliseconds > 3000) - // { - // Log.Warning($"慢查询: {db.Ado.SqlExecutionTime.TotalMilliseconds}ms, SQL: " + finalSql); - // } - // Console.WriteLine(); - // }; + // Log.Warning($"慢查询: {db.Ado.SqlExecutionTime.TotalMilliseconds}ms, SQL: " + finalSql); + // } + // Console.WriteLine(); + // }; // db.Aop.OnError = (ex) => - // { - // Log.Error(UtilMethods.GetSqlString(db.CurrentConnectionConfig.DbType, ex.Sql, (SugarParameter[])ex.Parametres)); - // }; + // { + // Log.Error(UtilMethods.GetSqlString(db.CurrentConnectionConfig.DbType, ex.Sql, (SugarParameter[])ex.Parametres)); + // }; //}); }); services.AddConfigurableOptions(); diff --git a/common/Tnb.Common.Core/Manager/DataBase/DataBaseManager.cs b/common/Tnb.Common.Core/Manager/DataBase/DataBaseManager.cs index 02f79cba..db3d0b5b 100644 --- a/common/Tnb.Common.Core/Manager/DataBase/DataBaseManager.cs +++ b/common/Tnb.Common.Core/Manager/DataBase/DataBaseManager.cs @@ -10,6 +10,7 @@ using JNPF.Common.Models.VisualDev; using JNPF.Common.Security; using JNPF.DependencyInjection; using JNPF.FriendlyException; +using JNPF.Logging; using JNPF.Systems.Entitys.Dto.Database; using JNPF.Systems.Entitys.Model.DataBase; using JNPF.Systems.Entitys.System; @@ -25,343 +26,366 @@ namespace JNPF.Common.Core.Manager; /// public class DataBaseManager : IDataBaseManager, ITransient { - /// - /// 初始化客户端. - /// - private static SqlSugarScope _sqlSugarClient; + /// + /// 初始化客户端. + /// + private static SqlSugarScope _sqlSugarClient; - /// - /// 用户管理器. - /// - private readonly IUserManager _userManager; + /// + /// 用户管理器. + /// + private readonly IUserManager _userManager; - /// - /// 数据库配置选项. - /// - private readonly ConnectionStringsOptions _connectionStrings; + /// + /// 数据库配置选项. + /// + private readonly ConnectionStringsOptions _connectionStrings; - /// - /// 构造函数. - /// - public DataBaseManager( - IOptions connectionOptions, - IUserManager userManager, - ISqlSugarClient context) + /// + /// 构造函数. + /// + 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 = (SqlSugarScope)context; - _userManager = userManager; - _connectionStrings = connectionOptions.Value; + _sqlSugarClient.ChangeDatabase(link.Id); } - - /// - /// 数据库切换. - /// - /// 数据连接. - /// 切库后的SqlSugarClient. - public SqlSugarScope ChangeDataBase(DbLinkEntity link) + else { - if (_sqlSugarClient.AsTenant().IsAnyConnection(link.Id)) + _sqlSugarClient.AddConnection(new ConnectionConfig() + { + ConfigId = link.Id, + DbType = ToDbType(link.DbType), + ConnectionString = ToConnectionString(link), + InitKeyType = InitKeyType.Attribute, + IsAutoCloseConnection = true + }); + var db = _sqlSugarClient.GetConnectionScope(link.Id); + + // 设置超时时间 + db.Ado.CommandTimeOut = 30; + db.Aop.OnLogExecuted = (sql, pars) => + { + var oldColor = Console.ForegroundColor; + Console.ForegroundColor = ConsoleColor.Green; + var finalSql = UtilMethods.GetSqlString(db.CurrentConnectionConfig.DbType, sql, pars); + Console.WriteLine($"【{DateTime.Now.ToString("HH:mm:ss.fff")}——SQL执行完成】{db.Ado.SqlExecutionTime.TotalMilliseconds} ms"); + Console.WriteLine(finalSql); + Console.ForegroundColor = oldColor; + if (db.Ado.SqlExecutionTime.TotalMilliseconds > 3000) { - _sqlSugarClient.ChangeDatabase(link.Id); + Log.Warning($"慢查询: {db.Ado.SqlExecutionTime.TotalMilliseconds}ms, SQL: " + finalSql); } - else + Console.WriteLine(); + }; + db.Aop.OnError = (ex) => + { + Log.Error(UtilMethods.GetSqlString(db.CurrentConnectionConfig.DbType, ex.Sql, (SugarParameter[])ex.Parametres)); + }; + + _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() { - _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; + currentPage = pageInput.currentPage, + pageSize = pageInput.pageSize, + total = total + }, + list = dt.ToObject>>().ToObject>>() + }; } - - /// - /// 获取多租户Link. - /// - /// 租户ID. - /// 租户数据库. - /// - public DbLinkEntity GetTenantDbLink(string tenantId, string tenantName) + catch (Exception ex) { - return new DbLinkEntity - { - Id = tenantId, - ServiceName = tenantName, - DbType = _connectionStrings.DBType, - Host = _connectionStrings.Host, - Port = _connectionStrings.Port, - UserName = _connectionStrings.UserName, - Password = _connectionStrings.Password - }; + throw; } + } - /// - /// 执行Sql(查询). - /// - /// 数据连接. - /// sql语句. - /// - public async Task ExecuteSql(DbLinkEntity link, string strSql) - { - if (link != null && _sqlSugarClient.CurrentConnectionConfig.ConfigId != link.Id) - _sqlSugarClient = ChangeDataBase(link); + /// + /// 表是否存在. + /// + /// 数据连接. + /// 表名. + /// + public bool IsAnyTable(DbLinkEntity link, string table) + { + 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 _sqlSugarClient.DbMaintenance.IsAnyTable(table, false); + } - return flag; - } + /// + /// 表字段是否存在. + /// + /// 数据连接. + /// 表名. + /// 表字段名. + /// + public bool IsAnyColumn(DbLinkEntity link, string table, string column) + { + if (link != null && _sqlSugarClient.CurrentConnectionConfig.ConfigId != link.Id) + _sqlSugarClient = ChangeDataBase(link); - /// - /// 条件动态过滤. - /// - /// 数据连接. - /// sql语句. - /// 条件是否成立. - public bool WhereDynamicFilter(DbLinkEntity link, string strSql) - { - if (link != null && _sqlSugarClient.CurrentConnectionConfig.ConfigId != link.Id) - _sqlSugarClient = ChangeDataBase(link); + return _sqlSugarClient.DbMaintenance.IsAnyColumn(table, column, false); + } - return _sqlSugarClient.Ado.SqlQuery(strSql).Count > 0; - } + /// + /// 获取表字段列表. + /// + /// 数据连接. + /// 表名. + /// TableFieldListModel. + public List GetFieldList(DbLinkEntity? link, string? tableName) + { + if (link != null && _sqlSugarClient.CurrentConnectionConfig.ConfigId != link.Id) _sqlSugarClient = ChangeDataBase(link); - /// - /// 执行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); - - List list; + List list; if (link.DbType == SqlSugar.DbType.PostgreSQL.ToString()) { var sql = @"SELECT pcolumn.table_name AS tableName,pcolumn.column_name AS field,pcolumn.udt_name AS dataType, @@ -385,607 +409,614 @@ WHERE pcolumn.table_name='{0}' ORDER BY ordinal_position"; list = _sqlSugarClient.SqlQueryable(string.Format(sql, tableName)).ToList(); } else - { + { list = _sqlSugarClient.DbMaintenance.GetColumnInfosByTableName(tableName, false).Adapt>(); } - return list; - } + return list; + } - /// - /// 获取表数据. - /// - /// 数据连接. - /// 表名. - /// - public DataTable GetData(DbLinkEntity link, string tableName) + public List GetPrimaries(DbLinkEntity? link, string tableName) + { + if (link != null && _sqlSugarClient.CurrentConnectionConfig.ConfigId != link.Id) _sqlSugarClient = ChangeDataBase(link); + + return _sqlSugarClient.DbMaintenance.GetPrimaries(tableName); + } + + /// + /// 获取表数据. + /// + /// 数据连接. + /// 表名. + /// + 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); - return _sqlSugarClient.Queryable().AS(tableName).ToDataTable(); + 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); } - - /// - /// 根据链接获取数据. - /// - /// 数据连接. - /// sql语句. - /// 参数. - /// - public DataTable GetInterFaceData(DbLinkEntity link, string strSql, params SugarParameter[] parameters) + catch (Exception) { - 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); - } + throw Oops.Oh(ErrorCode.D1511); } + } - /// - /// 执行增删改sql. - /// - /// 数据连接. - /// sql语句. - /// 参数. - public void ExecuteCommand(DbLinkEntity link, string strSql, params SugarParameter[] parameters) + /// + /// 执行增删改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() { - if (link != null && _sqlSugarClient.CurrentConnectionConfig.ConfigId != link.Id) - _sqlSugarClient = ChangeDataBase(link); + tableInfo = _sqlSugarClient.DbMaintenance.GetTableInfoList(false).Find(m => m.Name == tableName).Adapt(), + tableFieldList = GetFieldList(link, tableName).Adapt>() + //tableFieldList = _sqlSugarClient.DbMaintenance.GetColumnInfosByTableName(tableName, false).Adapt>() + }; - if (_sqlSugarClient.CurrentConnectionConfig.DbType == SqlSugar.DbType.Oracle) - strSql = strSql.Replace(";", string.Empty); + data.tableFieldList = ViewDataTypeConversion(data.tableFieldList, _sqlSugarClient.CurrentConnectionConfig.DbType); - _sqlSugarClient.Ado.ExecuteCommand(strSql, parameters); + 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; + } } - - /// - /// 获取表信息. - /// - /// 数据连接. - /// 表名. - /// - public DatabaseTableInfoOutput GetDataBaseTableInfo(DbLinkEntity link, string tableName) + catch (Exception ex) { - 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 = GetFieldList(link, tableName).Adapt>() - //tableFieldList = _sqlSugarClient.DbMaintenance.GetColumnInfosByTableName(tableName, false).Adapt>() - }; - - data.tableFieldList = ViewDataTypeConversion(data.tableFieldList, _sqlSugarClient.CurrentConnectionConfig.DbType); - - return data; + throw; } + } - /// - /// 获取数据库表信息. - /// - /// 数据连接. - /// - public List GetDBTableList(DbLinkEntity link) + /// + /// 使用存储过程. + /// + /// 数据连接. + /// 存储过程名称. + /// 参数. + 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) { - 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() + item.dataType = item.dataType.ToLower(); + switch (item.dataType) + { + case "string": + { + item.dataType = "varchar"; + if (item.dataLength.ParseToInt() > 2000) { - CurrentPage = pageIndex, - PageSize = pageSize, - Total = totalNumber + item.dataType = "text"; + item.dataLength = "50"; } - }); + } + + break; + case "single": + item.dataType = "decimal"; + break; + } } - /// - /// 获取数据表分页(实体). - /// - /// T. - /// 数据连接. - /// 页数. - /// 条数. - /// - public async Task> GetDataTablePage(DbLinkEntity link, int pageIndex, int pageSize) - { - if (link != null && _sqlSugarClient.CurrentConnectionConfig.ConfigId != link.Id) - _sqlSugarClient = ChangeDataBase(link); + return fields; + } - return await _sqlSugarClient.Queryable().ToPageListAsync(pageIndex, pageSize); + /// + /// 转换数据库类型. + /// + /// 数据库类型. + /// + 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 async Task SyncData(DbLinkEntity link, DataTable dt, string table) + /// + /// 转换连接字符串. + /// + /// 数据连接. + /// + public string ToConnectionString(DbLinkEntity dbLinkEntity) + { + switch (dbLinkEntity.DbType.ToLower()) { - 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; + 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); } + } - /// - /// 同步表操作. - /// - /// 原数据库. - /// 目前数据库. - /// 表名称. - /// 操作类型. - /// 数据类型. - public void SyncTable(DbLinkEntity linkFrom, DbLinkEntity linkTo, string table, int type, Dictionary fieldType) + /// + /// 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) { - try + dynamic model = new ExpandoObject(); + var dict = (IDictionary)model; + foreach (DataColumn column in table.Columns) + { + if (FilterField.Length != 0) { - switch (type) + if (reverse) + { + if (!FilterField.Contains(column.ColumnName)) { - 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; + dict[column.ColumnName] = row[column]; } - } - 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) + } + else + { + if (FilterField.Contains(column.ColumnName)) { - 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; + dict[column.ColumnName] = row[column]; } + } } else { - return dataType; + 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; + } + } } \ No newline at end of file diff --git a/common/Tnb.Common.Core/Manager/DataBase/IDataBaseManager.cs b/common/Tnb.Common.Core/Manager/DataBase/IDataBaseManager.cs index 207f4a61..93d25396 100644 --- a/common/Tnb.Common.Core/Manager/DataBase/IDataBaseManager.cs +++ b/common/Tnb.Common.Core/Manager/DataBase/IDataBaseManager.cs @@ -15,247 +15,255 @@ namespace JNPF.Common.Core.Manager; /// public interface IDataBaseManager { - /// - /// 获取多租户Link. - /// - /// 租户ID. - /// 租户数据库. - /// 租户的DBLink实体对象. - DbLinkEntity GetTenantDbLink(string tenantId, string tenantName); + /// + /// 获取多租户Link. + /// + /// 租户ID. + /// 租户数据库. + /// 租户的DBLink实体对象. + DbLinkEntity GetTenantDbLink(string tenantId, string tenantName); - /// - /// 数据库切换. - /// - /// 数据连接. - /// 切库后的SqlSugarClient. - SqlSugarScope ChangeDataBase(DbLinkEntity link); + /// + /// 数据库切换. + /// + /// 数据连接. + /// 切库后的SqlSugarClient. + SqlSugarScope ChangeDataBase(DbLinkEntity link); - /// - /// 执行Sql(查询). - /// - /// 数据连接. - /// sql语句. - /// - Task ExecuteSql(DbLinkEntity link, string strSql); + /// + /// 执行Sql(查询). + /// + /// 数据连接. + /// sql语句. + /// + Task ExecuteSql(DbLinkEntity link, string strSql); - /// - /// 条件动态过滤. - /// - /// 数据连接. - /// sql语句. - /// 条件是否成立. - bool WhereDynamicFilter(DbLinkEntity link, string strSql); + /// + /// 条件动态过滤. + /// + /// 数据连接. + /// sql语句. + /// 条件是否成立. + bool WhereDynamicFilter(DbLinkEntity link, string strSql); - /// - /// 执行Sql(新增、修改). - /// - /// 数据连接. - /// 表名. - /// 数据. - /// 主键字段. - /// - Task ExecuteSql(DbLinkEntity link, string table, List> dicList, string primaryField = ""); + /// + /// 执行Sql(新增、修改). + /// + /// 数据连接. + /// 表名. + /// 数据. + /// 主键字段. + /// + Task ExecuteSql(DbLinkEntity link, string table, List> dicList, string primaryField = ""); - /// - /// 执行Sql 新增 并返回自增长Id. - /// - /// 数据连接. - /// 表名. - /// 数据. - /// 主键字段. - /// - Task ExecuteReturnIdentityAsync(DbLinkEntity link, string table, List> dicList, string primaryField = ""); + /// + /// 执行Sql 新增 并返回自增长Id. + /// + /// 数据连接. + /// 表名. + /// 数据. + /// 主键字段. + /// + Task ExecuteReturnIdentityAsync(DbLinkEntity link, string table, List> dicList, string primaryField = ""); - /// - /// 创建表. - /// - /// 数据连接. - /// 表对象. - /// 字段对象. - /// - Task Create(DbLinkEntity link, DbTableModel tableModel, List tableFieldList); + /// + /// 创建表. + /// + /// 数据连接. + /// 表对象. + /// 字段对象. + /// + Task Create(DbLinkEntity link, DbTableModel tableModel, List tableFieldList); - /// - /// sqlsugar添加表字段. - /// - /// 表名. - /// 表字段集合. - void AddTableColumn(DbLinkEntity link ,string tableName, List tableFieldList); + /// + /// sqlsugar添加表字段. + /// + /// 表名. + /// 表字段集合. + void AddTableColumn(DbLinkEntity link, string tableName, List tableFieldList); - /// - /// 删除表. - /// - /// 数据连接. - /// 表名. - /// - bool Delete(DbLinkEntity link, string table); + /// + /// 删除表. + /// + /// 数据连接. + /// 表名. + /// + bool Delete(DbLinkEntity link, string table); - /// - /// 修改表. - /// - /// 数据连接. - /// 旧表名称. - /// 表对象. - /// 字段对象. - /// - Task Update(DbLinkEntity link, string oldTable, DbTableModel tableModel, List tableFieldList); + /// + /// 修改表. + /// + /// 数据连接. + /// 旧表名称. + /// 表对象. + /// 字段对象. + /// + Task Update(DbLinkEntity link, string oldTable, DbTableModel tableModel, List tableFieldList); - /// - /// 根据链接获取分页数据. - /// - /// 数据连接. - /// Sql语句. - /// 页数. - /// 列配置. - /// 数据权限. - /// 输出列名称. - /// - PageResult> GetInterFaceData(DbLinkEntity link, string strSql, VisualDevModelListQueryInput pageInput, MainBeltViceQueryModel columnDesign, List dataPermissions, Dictionary outColumnName = null); + /// + /// 根据链接获取分页数据. + /// + /// 数据连接. + /// Sql语句. + /// 页数. + /// 列配置. + /// 数据权限. + /// 输出列名称. + /// + PageResult> GetInterFaceData(DbLinkEntity link, string strSql, VisualDevModelListQueryInput pageInput, MainBeltViceQueryModel columnDesign, List dataPermissions, Dictionary outColumnName = null); - /// - /// 表是否存在. - /// - /// 数据连接. - /// 表名. - /// - bool IsAnyTable(DbLinkEntity link, string table); + /// + /// 表是否存在. + /// + /// 数据连接. + /// 表名. + /// + bool IsAnyTable(DbLinkEntity link, string table); - /// - /// 表字段是否存在. - /// - /// 数据连接. - /// 表名. - /// 表字段名. - /// - bool IsAnyColumn(DbLinkEntity link, string table, string column); + /// + /// 表字段是否存在. + /// + /// 数据连接. + /// 表名. + /// 表字段名. + /// + bool IsAnyColumn(DbLinkEntity link, string table, string column); - /// - /// 获取表字段列表. - /// - /// 数据连接. - /// 表名. - /// - List GetFieldList(DbLinkEntity? link, string? tableName); + /// + /// 获取表字段列表. + /// + /// 数据连接. + /// 表名. + /// + List GetFieldList(DbLinkEntity? link, string? tableName); - /// - /// 获取表数据. - /// - /// 数据连接. - /// 表名. - /// - DataTable GetData(DbLinkEntity link, string tableName); + /// + /// 获取表的主键 + /// + /// + /// + /// + List GetPrimaries(DbLinkEntity? link, string tableName); - /// - /// 根据链接获取数据. - /// - /// 数据连接. - /// Sql语句. - /// 参数. - /// - DataTable GetInterFaceData(DbLinkEntity link, string strSql, params SugarParameter[] parameters); + /// + /// 获取表数据. + /// + /// 数据连接. + /// 表名. + /// + DataTable GetData(DbLinkEntity link, string tableName); - /// - /// 获取表信息. - /// - /// 数据连接. - /// 表名. - /// - DatabaseTableInfoOutput GetDataBaseTableInfo(DbLinkEntity link, string tableName); + /// + /// 根据链接获取数据. + /// + /// 数据连接. + /// Sql语句. + /// 参数. + /// + DataTable GetInterFaceData(DbLinkEntity link, string strSql, params SugarParameter[] parameters); - /// - /// 获取数据库表信息. - /// - /// 数据连接. - /// - List GetDBTableList(DbLinkEntity link); + /// + /// 获取表信息. + /// + /// 数据连接. + /// 表名. + /// + DatabaseTableInfoOutput GetDataBaseTableInfo(DbLinkEntity link, string tableName); - /// - /// 获取数据库表信息. - /// - /// 数据连接. - /// - List GetTableInfos(DbLinkEntity link); + /// + /// 获取数据库表信息. + /// + /// 数据连接. + /// + List GetDBTableList(DbLinkEntity link); - /// - /// 获取数据表分页(SQL语句). - /// - /// 数据连接. - /// 数据SQL. - /// 页数. - /// 条数. - /// - Task GetDataTablePage(DbLinkEntity link, string dbSql, int pageIndex, int pageSize); + /// + /// 获取数据库表信息. + /// + /// 数据连接. + /// + List GetTableInfos(DbLinkEntity link); - /// - /// 获取数据表分页(实体). - /// - /// T. - /// 数据连接. - /// 页数. - /// 条数. - /// - Task> GetDataTablePage(DbLinkEntity link, int pageIndex, int pageSize); + /// + /// 获取数据表分页(SQL语句). + /// + /// 数据连接. + /// 数据SQL. + /// 页数. + /// 条数. + /// + Task GetDataTablePage(DbLinkEntity link, string dbSql, int pageIndex, int pageSize); - /// - /// 使用存储过程. - /// - /// 数据连接. - /// 存储过程名称. - /// 参数. - void UseStoredProcedure(DbLinkEntity link, string stored, List parameters); + /// + /// 获取数据表分页(实体). + /// + /// T. + /// 数据连接. + /// 页数. + /// 条数. + /// + Task> GetDataTablePage(DbLinkEntity link, int pageIndex, int pageSize); - /// - /// 测试数据库连接. - /// - /// 数据连接. - /// - bool IsConnection(DbLinkEntity link); + /// + /// 使用存储过程. + /// + /// 数据连接. + /// 存储过程名称. + /// 参数. + void UseStoredProcedure(DbLinkEntity link, string stored, List parameters); - /// - /// 同步数据. - /// - /// 数据连接. - /// 同步数据. - /// 表. - /// - Task SyncData(DbLinkEntity link, DataTable dt, string table); + /// + /// 测试数据库连接. + /// + /// 数据连接. + /// + bool IsConnection(DbLinkEntity link); - /// - /// 同步表操作. - /// - /// 原数据库. - /// 目前数据库. - /// 表名称. - /// 操作类型. - /// 数据类型. - void SyncTable(DbLinkEntity linkFrom, DbLinkEntity linkTo, string table, int type, Dictionary fieldType); + /// + /// 同步数据. + /// + /// 数据连接. + /// 同步数据. + /// 表. + /// + Task SyncData(DbLinkEntity link, DataTable dt, string table); - /// - /// 视图数据类型转换. - /// - /// 字段数据. - /// 数据库类型. - List ViewDataTypeConversion(List fields, SqlSugar.DbType databaseType); + /// + /// 同步表操作. + /// + /// 原数据库. + /// 目前数据库. + /// 表名称. + /// 操作类型. + /// 数据类型. + void SyncTable(DbLinkEntity linkFrom, DbLinkEntity linkTo, string table, int type, Dictionary fieldType); - /// - /// 转换数据库类型. - /// - /// 数据库类型. - /// - SqlSugar.DbType ToDbType(string dbType); + /// + /// 视图数据类型转换. + /// + /// 字段数据. + /// 数据库类型. + List ViewDataTypeConversion(List fields, SqlSugar.DbType databaseType); - /// - /// 转换连接字符串. - /// - /// 数据连接. - /// - string ToConnectionString(DbLinkEntity dbLinkEntity); + /// + /// 转换数据库类型. + /// + /// 数据库类型. + /// + SqlSugar.DbType ToDbType(string dbType); - /// - /// 执行增删改sql. - /// - /// 数据连接. - /// sql语句. - /// 参数. - void ExecuteCommand(DbLinkEntity link, string strSql, params SugarParameter[] parameters); + /// + /// 转换连接字符串. + /// + /// 数据连接. + /// + string ToConnectionString(DbLinkEntity dbLinkEntity); + + /// + /// 执行增删改sql. + /// + /// 数据连接. + /// sql语句. + /// 参数. + void ExecuteCommand(DbLinkEntity link, string strSql, params SugarParameter[] parameters); } \ No newline at end of file diff --git a/common/Tnb.SqlSugar/Repositories/SqlSugarRepository.cs b/common/Tnb.SqlSugar/Repositories/SqlSugarRepository.cs index 75d07d4c..aebedc0a 100644 --- a/common/Tnb.SqlSugar/Repositories/SqlSugarRepository.cs +++ b/common/Tnb.SqlSugar/Repositories/SqlSugarRepository.cs @@ -72,7 +72,6 @@ where TEntity : class, new() base.Context.Ado.CommandTimeOut = 30; base.Context.Aop.OnLogExecuted = (sql, pars) => { - // 在控制台输出sql语句 var oldColor = Console.ForegroundColor; Console.ForegroundColor = ConsoleColor.Green; var finalSql = UtilMethods.GetSqlString(Context.CurrentConnectionConfig.DbType, sql, pars); diff --git a/visualdev/Tnb.VisualDev/RunService.cs b/visualdev/Tnb.VisualDev/RunService.cs index 75cd7cdf..6f991a9d 100644 --- a/visualdev/Tnb.VisualDev/RunService.cs +++ b/visualdev/Tnb.VisualDev/RunService.cs @@ -1732,10 +1732,13 @@ public class RunService : IRunService, ITransient /// private string GetPrimary(DbLinkEntity link, string MainTableName) { - List? tableList = _databaseService.GetFieldList(link, MainTableName); // 获取主表所有列 - DbTableFieldModel? mainPrimary = tableList.Find(t => t.primaryKey); // 主表主键 - if (mainPrimary == null || mainPrimary.IsNullOrEmpty()) throw Oops.Oh(ErrorCode.D1402); // 主表未设置主键 - return mainPrimary.field; + var keys = _databaseService.GetPrimaries(link, MainTableName); + if (keys.Count < 1) throw Oops.Oh(ErrorCode.D1402); // 主表未设置主键 + return keys.First(); + //List? tableList = _databaseService.GetFieldList(link, MainTableName); // 获取主表所有列 + //DbTableFieldModel? mainPrimary = tableList.Find(t => t.primaryKey); // 主表主键 + //if (mainPrimary == null || mainPrimary.IsNullOrEmpty()) throw Oops.Oh(ErrorCode.D1402); // 主表未设置主键 + //return mainPrimary.field; } ///