using learun.database; using learun.iapplication; using learun.util; using System; using System.Collections.Generic; using System.Data; using System.Text; using System.Threading.Tasks; namespace learun.application { /// /// 版 本 EasyCode EC管理后台 /// Copyright (c) 2019-present EC管理有限公司 /// 创建人:tobin /// 日 期:2019.09.19 /// 描 述:数据库表管理 /// public class DatabaseTableService : ServiceBase { #region 获取数据 /// /// 数据表列表 /// /// 数据库编码 /// public Task> GetTableList(string code) { return this.BaseRepository(code).GetDataBaseTable(); } /// /// 数据表字段列表 /// /// 数据库编码 /// 表名 /// public Task> GetTableFiledList(string code, string tableName) { return this.BaseRepository(code).GetDataBaseTableFields(tableName); } /// /// 数据库表数据列表 /// /// 数据库编码 /// 表明 /// 字段 /// 逻辑 /// 关键字 /// 分页参数 /// public Task GetTableDataList(string code, string tableName, string field, string logic, string keyword, Pagination pagination) { StringBuilder strSql = new StringBuilder(); strSql.Append("SELECT * FROM " + tableName + " WHERE 1=1"); if (!string.IsNullOrEmpty(keyword) && !string.IsNullOrEmpty(logic) && logic != "Null" && logic != "NotNull") { strSql.Append(" AND " + field + " "); switch (logic) { case "Equal": //等于 strSql.Append(" = "); break; case "NotEqual": //不等于 strSql.Append(" <> "); break; case "Greater": //大于 strSql.Append(" > "); break; case "GreaterThan": //大于等于 strSql.Append(" >= "); break; case "Less": //小于 strSql.Append(" < "); break; case "LessThan": //小于等于 strSql.Append(" >= "); break; case "Like": //包含 strSql.Append(" like "); keyword = "%" + keyword + "%"; break; default: break; } strSql.Append("@keyword "); } if (logic == "Null") { strSql.Append(" AND " + field + " is null "); } else if (logic == "NotNull") { strSql.Append(" AND " + field + " is not null "); } return this.BaseRepository(code).FindTable(strSql.ToString(), new { keyword }, pagination); } /// /// 数据库表数据列表 /// /// 数据库编码 /// 表名 /// public Task GetTableDataList(string code, string tableName) { StringBuilder strSql = new StringBuilder(); strSql.Append(" SELECT * FROM " + tableName); return this.BaseRepository(code).FindTable(strSql.ToString()); } /// /// 数据库表数据列表 /// /// 数据库编码 /// 表名 /// public Task> GetSqlColName(string code, string strSql) { return this.BaseRepository(code).GetSqlColName(strSql); } #endregion 获取数据 #region 提交数据 /// /// 创建数据库表 /// /// 数据库编码 /// /// /// /// public async Task CreateTable(string code, string tableName, string tableRemark, List colList) { var db = this.BaseRepository(code).BeginTrans(); try { string sql = ""; switch (this.DBType(code))//SqlServer,Oracle,MySql { case "SqlServer": sql = GetSqlServerCreateTableSql(tableName, tableRemark, colList); await db.ExecuteSql(sql); break; case "MySql": sql = GetMySqlCreateTableSql(tableName, tableRemark, colList); await db.ExecuteSql(sql); break; case "Oracle": await GetOracleCreateTableSql(tableName, tableRemark, colList, db); break; } db.Commit(); } catch (Exception) { db.Rollback(); throw; } return "建表成功"; } /// /// 获取sqlserver建表语句 /// /// 表名 /// 表备注 /// 字段集合 /// private string GetSqlServerCreateTableSql(string tableName, string tableRemark, List colList) { StringBuilder sql = new StringBuilder(); sql.Append("CREATE TABLE " + tableName + " ( ");//表名 foreach (var item in colList) { sql.Append(item.f_column + " " + item.f_datatype);//列名+类型 if (item.f_datatype == "varchar" && !string.IsNullOrEmpty(item.f_length)) { sql.Append("(" + item.f_length + ") ");//长度 } if (item.f_key == "1") { sql.Append(" PRIMARY KEY ");//是否主键 } else if (item.f_isnullable == "0") { sql.Append(" NOT NULL ");//是否为空 } sql.Append(","); } sql.Remove(sql.Length - 1, 1); sql.Append(" )"); foreach (var item in colList) { if (!string.IsNullOrEmpty(item.f_remark)) { //添加列备注 sql.Append(" execute sp_addextendedproperty 'MS_Description','" + item.f_remark + "','user','dbo','table','" + tableName + "','column','" + item.f_column + "';"); } } //添加表备注 if (!string.IsNullOrEmpty(tableRemark)) { sql.Append(" execute sp_addextendedproperty 'MS_Description','" + tableRemark + "','user','dbo','table','" + tableName + "',null,null; "); } return sql.ToString(); } /// /// 获取MySql建表语句 /// /// 表名 /// 表备注 /// 字段集合 /// private string GetMySqlCreateTableSql(string tableName, string tableRemark, List colList) { StringBuilder sql = new StringBuilder(); sql.Append("CREATE TABLE " + tableName + " ( ");//表名 foreach (var item in colList) { sql.Append(item.f_column + " " + item.f_datatype);//列名+类型 if (item.f_datatype == "varchar" && !string.IsNullOrEmpty(item.f_length)) { sql.Append("(" + item.f_length + ") ");//长度 } if (item.f_key == "1") { sql.Append(" PRIMARY KEY ");//是否主键 } else if (item.f_isnullable == "0") { sql.Append(" NOT NULL ");//是否为空 } if (!string.IsNullOrEmpty(item.f_remark)) { sql.Append(" COMMENT '" + item.f_remark + "'");//列备注 } sql.Append(","); } sql.Remove(sql.Length - 1, 1); sql.Append(" )"); //添加表备注 if (!string.IsNullOrEmpty(tableRemark)) { sql.Append(" ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='" + tableRemark + "';"); } return sql.ToString(); } /// /// 获取Oracle建表语句 /// /// 表名 /// 表备注 /// 字段集合 /// 数据库操作上下文 /// private async Task GetOracleCreateTableSql(string tableName, string tableRemark, List colList, IRepository db) { StringBuilder sql = new StringBuilder(); sql.Append("CREATE TABLE \"" + tableName.ToUpper() + "\" ( ");//表名 foreach (var item in colList) { sql.Append("\"" + item.f_column.ToUpper() + "\" " + GetOracleDataType(item.f_datatype));//列名+类型 if (item.f_datatype == "varchar" && !string.IsNullOrEmpty(item.f_length)) { sql.Append("(" + item.f_length + " CHAR) ");//长度 } if (item.f_key == "1") { sql.Append(" PRIMARY KEY NOT NULL ");//是否主键 } else if (item.f_isnullable == "0") { sql.Append(" NOT NULL ");//是否为空 } else { sql.Append(" NULL ");//是否为空 } sql.Append(","); } sql.Remove(sql.Length - 1, 1); sql.Append(" )"); await db.ExecuteSql(sql.ToString()); ////添加表备注 if (!string.IsNullOrEmpty(tableRemark)) { await db.ExecuteSql(" COMMENT ON TABLE \"" + tableName.ToUpper() + "\" is '" + tableRemark + "' "); } foreach (var item in colList) { if (!string.IsNullOrEmpty(item.f_remark)) { //添加列备注 await db.ExecuteSql(" COMMENT ON COLUMN \"" + tableName.ToUpper() + "\".\"" + item.f_column.ToUpper() + "\" is '" + item.f_remark + "'"); } } } /// /// 获取字段类型 /// /// /// private string GetOracleDataType(string dataType) { string res = ""; switch (dataType) { case "varchar": res = "VARCHAR2"; break; case "datetime": res = "DATE"; break; case "int": case "decimal": res = "NUMBER(11)"; break; } return res; } #endregion 提交数据 #region 扩展方法 /// /// 判断数据表字段重复 /// /// 主键值 /// 表名 /// 主键名 /// 数据字段 /// public async Task ExistFiled(string keyValue, string tableName, string keyName, string filedsJson) { StringBuilder strSql = new StringBuilder(); strSql.Append("select * from " + tableName + " where 1=1 "); if (!string.IsNullOrEmpty(keyValue)) { strSql.Append(" AND " + keyName + " != @keyValue "); } var args = filedsJson.ToJObject(); foreach (var item in args.Properties()) { if (!string.IsNullOrEmpty(item.Value.ToString())) { strSql.Append(" AND " + item.Name + " = '" + item.Value + "'"); } } var entity = await this.BaseRepository().FindEntity(strSql.ToString(), new { keyValue }); if (entity == null) { return true; } else { return false; } } #endregion 扩展方法 } }