using Learun.DataBase.Repository; using Learun.Util; using System; using System.Collections.Generic; using System.Data; using System.Text; namespace Learun.Application.Base.SystemModule { /// /// 版 本 Learun-ADMS-Ultimate V7.0.0 数字化智慧校园 /// Copyright (c) 2013-2018 北京泉江科技有限公司 /// 创建人:陈彬彬 /// 日 期:2017.03.08 /// 描 述:数据库表管理 /// public class DatabaseTableService : RepositoryFactory { #region 获取数据 /// /// 数据表列表 /// /// 数据库连接信息 /// public IEnumerable GetTableList(DatabaseLinkEntity databaseLinkEntity) { try { if (databaseLinkEntity == null) { return new List(); } return this.BaseRepository(databaseLinkEntity.F_DbConnection, databaseLinkEntity.F_DbType).GetDBTable(); } catch (Exception ex) { if (ex is ExceptionEx) { throw; } else { throw ExceptionEx.ThrowServiceException(ex); } } } /// /// 数据表字段列表 /// /// 数据库连接信息 /// 表名 /// public IEnumerable GetTableFiledList(DatabaseLinkEntity databaseLinkEntity, string tableName) { try { if (databaseLinkEntity == null) { return new List(); } return this.BaseRepository(databaseLinkEntity.F_DbConnection, databaseLinkEntity.F_DbType).GetDBTableFields(tableName); } catch (Exception ex) { if (ex is ExceptionEx) { throw; } else { throw ExceptionEx.ThrowServiceException(ex); } } } /// /// 数据库表数据列表 /// /// 库连接信息 /// 表明 /// 条件 /// 逻辑 /// 关键字 /// 分页参数 /// public DataTable GetTableDataList(DatabaseLinkEntity databaseLinkEntity, string tableName, string field, string logic, string keyword, Pagination pagination) { try { 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(databaseLinkEntity.F_DbConnection, databaseLinkEntity.F_DbType).FindTable(strSql.ToString(), new { keyword = keyword }, pagination); } catch (Exception ex) { if (ex is ExceptionEx) { throw; } else { throw ExceptionEx.ThrowServiceException(ex); } } } /// /// 数据库表数据列表 /// /// 库连接信息 /// 表名 /// public DataTable GetTableDataList(DatabaseLinkEntity databaseLinkEntity, string tableName) { try { StringBuilder strSql = new StringBuilder(); strSql.Append(" SELECT * FROM " + tableName); return this.BaseRepository(databaseLinkEntity.F_DbConnection, databaseLinkEntity.F_DbType).FindTable(strSql.ToString()); } catch (Exception ex) { if (ex is ExceptionEx) { throw; } else { throw ExceptionEx.ThrowServiceException(ex); } } } /// /// 数据库表数据列表 /// /// 库连接信息 /// 表名 /// public List GetSqlColName(DatabaseLinkEntity databaseLinkEntity, string strSql) { try { var dt = this.BaseRepository(databaseLinkEntity.F_DbConnection, databaseLinkEntity.F_DbType).FindTable(strSql); List res = new List(); foreach (DataColumn item in dt.Columns) { res.Add(item.ColumnName); } return res; } catch (Exception ex) { if (ex is ExceptionEx) { throw; } else { throw ExceptionEx.ThrowServiceException(ex); } } } #endregion #region 提交数据 /// /// 创建数据库表 /// /// /// /// /// /// public string CreateTable(DatabaseLinkEntity databaseLinkEntity, string tableName, string tableRemark, List colList) { try { if (databaseLinkEntity == null) { return "当前数据库不存在"; } List tableList = (List)GetTableList(databaseLinkEntity); if (tableList.Find(t => t.name == tableName) != null) { return "表名重复"; } else { var db = this.BaseRepository(databaseLinkEntity.F_DbConnection, databaseLinkEntity.F_DbType).BeginTrans(); try { string sql = ""; switch (databaseLinkEntity.F_DbType) { case "SqlServer": sql = GetSqlServerCreateTableSql(tableName, tableRemark, colList); db.ExecuteBySql(sql); break; case "MySql": sql = GetMySqlCreateTableSql(tableName, tableRemark, colList); db.ExecuteBySql(sql); break; case "Oracle": GetOracleCreateTableSql(tableName, tableRemark, colList,db); break; } db.Commit(); } catch (Exception) { db.Rollback(); throw; } return "建表成功"; } } catch (Exception ex) { if (ex is ExceptionEx) { throw; } else { throw ExceptionEx.ThrowServiceException(ex); } } } /// /// 获取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" && item.f_length != 0) { 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" && item.f_length != 0) { 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 void 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" && item.f_length != 0) { 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(" )"); db.ExecuteBySql(sql.ToString()); ////添加表备注 if (!string.IsNullOrEmpty(tableRemark)) { db.ExecuteBySql(" COMMENT ON TABLE \"" + tableName.ToUpper() + "\" is '" + tableRemark + "' "); } foreach (var item in colList) { if (!string.IsNullOrEmpty(item.f_remark)) { //添加列备注 db.ExecuteBySql(" 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 } }