Files
SqlSugar/Src/Asp.Net/SqlSugar/Abstract/DbMaintenanceProvider/Methods.cs

583 lines
28 KiB
C#
Raw Normal View History

2017-01-07 21:54:51 +08:00
using System;
using System.Collections.Generic;
2019-05-17 20:34:53 +08:00
using System.IO;
2017-01-07 21:54:51 +08:00
using System.Linq;
using System.Text;
2017-06-05 20:49:02 +08:00
2017-01-07 21:54:51 +08:00
namespace SqlSugar
{
public abstract partial class DbMaintenanceProvider : IDbMaintenance
{
2017-06-05 20:49:02 +08:00
#region DML
2019-05-17 20:34:53 +08:00
public virtual List<string> GetDataBaseList(SqlSugarClient db)
{
return db.Ado.SqlQuery<string>(this.GetDataBaseSql);
}
2018-02-08 18:27:14 +08:00
public virtual List<DbTableInfo> GetViewInfoList(bool isCache = true)
2017-01-07 21:54:51 +08:00
{
2017-07-19 00:31:27 +08:00
string cacheKey = "DbMaintenanceProvider.GetViewInfoList";
cacheKey = GetCacheKey(cacheKey);
2018-02-08 18:27:14 +08:00
var result = new List<DbTableInfo>();
if (isCache)
result = GetListOrCache<DbTableInfo>(cacheKey, this.GetViewInfoListSql);
else
result = this.Context.Ado.SqlQuery<DbTableInfo>(this.GetViewInfoListSql);
2017-05-29 00:55:48 +08:00
foreach (var item in result)
{
item.DbObjectType = DbObjectType.View;
}
return result;
2017-01-07 21:54:51 +08:00
}
2018-02-08 18:27:14 +08:00
public virtual List<DbTableInfo> GetTableInfoList(bool isCache = true)
2017-01-07 21:54:51 +08:00
{
2017-07-19 00:31:27 +08:00
string cacheKey = "DbMaintenanceProvider.GetTableInfoList";
cacheKey = GetCacheKey(cacheKey);
2018-02-08 18:27:14 +08:00
var result = new List<DbTableInfo>();
if (isCache)
result = GetListOrCache<DbTableInfo>(cacheKey, this.GetTableInfoListSql);
else
result = this.Context.Ado.SqlQuery<DbTableInfo>(this.GetTableInfoListSql);
2017-05-29 00:55:48 +08:00
foreach (var item in result)
{
item.DbObjectType = DbObjectType.Table;
}
return result;
2017-01-07 21:54:51 +08:00
}
2018-02-08 18:27:14 +08:00
public virtual List<DbColumnInfo> GetColumnInfosByTableName(string tableName, bool isCache = true)
2017-01-07 21:54:51 +08:00
{
2017-05-25 12:39:51 +08:00
if (string.IsNullOrEmpty(tableName)) return new List<DbColumnInfo>();
2017-07-19 00:31:27 +08:00
string cacheKey = "DbMaintenanceProvider.GetColumnInfosByTableName." + this.SqlBuilder.GetNoTranslationColumnName(tableName).ToLower();
cacheKey = GetCacheKey(cacheKey);
2018-02-08 18:27:14 +08:00
var sql = string.Format(this.GetColumnInfosByTableNameSql, tableName);
if (isCache)
2018-11-10 16:54:02 +08:00
return GetListOrCache<DbColumnInfo>(cacheKey, sql).GroupBy(it => it.DbColumnName).Select(it => it.First()).ToList();
2018-02-08 18:27:14 +08:00
else
2018-04-21 11:05:27 +08:00
return this.Context.Ado.SqlQuery<DbColumnInfo>(sql).GroupBy(it => it.DbColumnName).Select(it => it.First()).ToList();
2018-02-08 18:27:14 +08:00
2017-01-07 21:54:51 +08:00
}
2017-05-01 23:00:05 +08:00
public virtual List<string> GetIsIdentities(string tableName)
2017-04-28 01:20:30 +08:00
{
2017-07-19 00:31:27 +08:00
string cacheKey = "DbMaintenanceProvider.GetIsIdentities" + this.SqlBuilder.GetNoTranslationColumnName(tableName).ToLower();
cacheKey = GetCacheKey(cacheKey);
2018-02-08 18:27:14 +08:00
return this.Context.Utilities.GetReflectionInoCacheInstance().GetOrCreate(cacheKey, () =>
{
var result = GetColumnInfosByTableName(tableName).Where(it => it.IsIdentity).ToList();
return result.Select(it => it.DbColumnName).ToList();
});
2017-05-01 23:00:05 +08:00
}
public virtual List<string> GetPrimaries(string tableName)
{
2017-07-19 00:31:27 +08:00
string cacheKey = "DbMaintenanceProvider.GetPrimaries" + this.SqlBuilder.GetNoTranslationColumnName(tableName).ToLower();
cacheKey = GetCacheKey(cacheKey);
2018-02-08 18:27:14 +08:00
return this.Context.Utilities.GetReflectionInoCacheInstance().GetOrCreate(cacheKey, () =>
{
var result = GetColumnInfosByTableName(tableName).Where(it => it.IsPrimarykey).ToList();
return result.Select(it => it.DbColumnName).ToList();
});
2017-04-28 01:20:30 +08:00
}
2017-06-05 20:49:02 +08:00
#endregion
2017-01-07 21:54:51 +08:00
2017-06-07 13:33:24 +08:00
#region Check
2018-02-08 18:27:14 +08:00
public virtual bool IsAnyTable(string tableName, bool isCache = true)
2017-06-07 13:33:24 +08:00
{
2020-12-17 12:52:21 +08:00
Check.Exception(string.IsNullOrEmpty(tableName), "IsAnyTable tableName is not null");
2017-06-25 19:16:10 +08:00
tableName = this.SqlBuilder.GetNoTranslationColumnName(tableName);
2018-02-08 18:27:14 +08:00
var tables = GetTableInfoList(isCache);
2017-06-12 14:02:58 +08:00
if (tables == null) return false;
else return tables.Any(it => it.Name.Equals(tableName, StringComparison.CurrentCultureIgnoreCase));
2017-06-07 13:33:24 +08:00
}
2021-04-24 18:50:12 +08:00
public virtual bool IsAnyColumn(string tableName, string columnName, bool isCache = true)
2017-06-07 13:33:24 +08:00
{
2018-04-04 13:45:54 +08:00
columnName = this.SqlBuilder.GetNoTranslationColumnName(columnName);
tableName = this.SqlBuilder.GetNoTranslationColumnName(tableName);
2021-04-24 18:50:12 +08:00
var isAny = IsAnyTable(tableName,isCache);
2017-06-12 14:02:58 +08:00
Check.Exception(!isAny, string.Format("Table {0} does not exist", tableName));
2021-04-24 18:50:12 +08:00
var columns = GetColumnInfosByTableName(tableName,isCache);
2017-06-12 14:02:58 +08:00
if (columns.IsNullOrEmpty()) return false;
return columns.Any(it => it.DbColumnName.Equals(columnName, StringComparison.CurrentCultureIgnoreCase));
2017-06-07 13:33:24 +08:00
}
2017-06-17 23:08:50 +08:00
public virtual bool IsPrimaryKey(string tableName, string columnName)
2017-06-07 13:33:24 +08:00
{
2018-04-04 13:45:54 +08:00
columnName = this.SqlBuilder.GetNoTranslationColumnName(columnName);
2017-06-12 14:02:58 +08:00
var isAny = IsAnyTable(tableName);
Check.Exception(!isAny, string.Format("Table {0} does not exist", tableName));
var columns = GetColumnInfosByTableName(tableName);
if (columns.IsNullOrEmpty()) return false;
2019-05-10 18:04:21 +08:00
var result=columns.Any(it => it.IsPrimarykey == true && it.DbColumnName.Equals(columnName, StringComparison.CurrentCultureIgnoreCase));
return result;
2017-06-07 13:33:24 +08:00
}
2017-06-17 23:08:50 +08:00
public virtual bool IsIdentity(string tableName, string columnName)
2017-06-07 13:33:24 +08:00
{
2018-04-04 13:45:54 +08:00
columnName = this.SqlBuilder.GetNoTranslationColumnName(columnName);
2017-06-12 14:02:58 +08:00
var isAny = IsAnyTable(tableName);
Check.Exception(!isAny, string.Format("Table {0} does not exist", tableName));
var columns = GetColumnInfosByTableName(tableName);
if (columns.IsNullOrEmpty()) return false;
return columns.Any(it => it.IsIdentity = true && it.DbColumnName.Equals(columnName, StringComparison.CurrentCultureIgnoreCase));
2017-06-07 13:33:24 +08:00
}
2017-06-18 05:29:42 +08:00
public virtual bool IsAnyConstraint(string constraintName)
{
return this.Context.Ado.GetInt("select object_id('" + constraintName + "')") > 0;
}
public virtual bool IsAnySystemTablePermissions()
{
2017-07-18 10:36:43 +08:00
this.Context.Ado.CheckConnection();
string sql = this.CheckSystemTablePermissionsSql;
try
{
2017-07-09 15:30:17 +08:00
var oldIsEnableLog = this.Context.Ado.IsEnableLogEvent;
this.Context.Ado.IsEnableLogEvent = false;
this.Context.Ado.ExecuteCommand(sql);
2017-07-09 15:30:17 +08:00
this.Context.Ado.IsEnableLogEvent = oldIsEnableLog;
return true;
}
catch
{
return false;
}
}
2017-06-07 13:33:24 +08:00
#endregion
2017-06-05 20:49:02 +08:00
#region DDL
2019-05-17 20:34:53 +08:00
/// <summary>
///by current connection string
/// </summary>
/// <param name="databaseDirectory"></param>
/// <returns></returns>
public virtual bool CreateDatabase(string databaseDirectory = null)
{
var seChar = Path.DirectorySeparatorChar.ToString();
2019-05-23 08:57:18 +08:00
if (databaseDirectory.HasValue())
2019-05-17 20:34:53 +08:00
{
databaseDirectory = databaseDirectory.TrimEnd('\\').TrimEnd('/');
}
var databaseName= this.Context.Ado.Connection.Database;
return CreateDatabase(databaseName,databaseDirectory);
}
/// <summary>
/// by databaseName
/// </summary>
/// <param name="databaseName"></param>
/// <param name="databaseDirectory"></param>
/// <returns></returns>
public virtual bool CreateDatabase(string databaseName, string databaseDirectory = null)
{
this.Context.Ado.ExecuteCommand(string.Format(CreateDataBaseSql, databaseName, databaseDirectory));
return true;
}
2017-06-17 23:08:50 +08:00
public virtual bool AddPrimaryKey(string tableName, string columnName)
2017-01-07 21:54:51 +08:00
{
2017-06-25 19:16:10 +08:00
tableName = this.SqlBuilder.GetTranslationTableName(tableName);
2017-07-19 00:31:27 +08:00
columnName = this.SqlBuilder.GetTranslationTableName(columnName);
string sql = string.Format(this.AddPrimaryKeySql, tableName, string.Format("PK_{0}_{1}", this.SqlBuilder.GetNoTranslationColumnName(tableName), this.SqlBuilder.GetNoTranslationColumnName(columnName)), columnName);
2017-06-17 23:08:50 +08:00
this.Context.Ado.ExecuteCommand(sql);
return true;
}
2019-02-10 18:38:24 +08:00
public bool AddPrimaryKeys(string tableName, string[] columnNames)
{
tableName = this.SqlBuilder.GetTranslationTableName(tableName);
var columnName = string.Join(",", columnNames);
2021-01-01 18:16:05 +08:00
var pkName = string.Format("PK_{0}_{1}", this.SqlBuilder.GetNoTranslationColumnName(tableName), columnName.Replace(",","_"));
string sql = string.Format(this.AddPrimaryKeySql, tableName,pkName, columnName);
2019-02-10 18:38:24 +08:00
this.Context.Ado.ExecuteCommand(sql);
return true;
}
2021-12-07 22:15:33 +08:00
public bool AddPrimaryKeys(string tableName, string[] columnNames,string pkName)
{
tableName = this.SqlBuilder.GetTranslationTableName(tableName);
var columnName = string.Join(",", columnNames);
//var pkName = string.Format("PK_{0}_{1}", this.SqlBuilder.GetNoTranslationColumnName(tableName), columnName.Replace(",", "_"));
string sql = string.Format(this.AddPrimaryKeySql, tableName, pkName, columnName);
this.Context.Ado.ExecuteCommand(sql);
return true;
}
2017-06-17 23:50:28 +08:00
public virtual bool AddColumn(string tableName, DbColumnInfo columnInfo)
2017-06-17 23:08:50 +08:00
{
2017-06-25 19:16:10 +08:00
tableName = this.SqlBuilder.GetTranslationTableName(tableName);
2022-04-23 15:43:45 +08:00
var isAddNotNUll = columnInfo.IsNullable == false && columnInfo.DefaultValue.HasValue();
if (isAddNotNUll)
{
columnInfo = this.Context.Utilities.TranslateCopy(columnInfo);
columnInfo.IsNullable = true;
}
2017-06-25 19:16:10 +08:00
string sql = GetAddColumnSql(tableName, columnInfo);
2017-06-17 21:15:58 +08:00
this.Context.Ado.ExecuteCommand(sql);
2022-04-23 15:43:45 +08:00
if (isAddNotNUll)
{
2022-04-23 16:05:46 +08:00
var dtColums = this.Context.Queryable<object>().AS(columnInfo.TableName).Where("1=2")
.Select(this.SqlBuilder.GetTranslationColumnName(columnInfo.DbColumnName)).ToDataTable().Columns.Cast<System.Data.DataColumn>();
2022-04-23 15:43:45 +08:00
var dtColumInfo = dtColums.First(it => it.ColumnName.EqualCase(columnInfo.DbColumnName));
var type = UtilMethods.GetUnderType(dtColumInfo.DataType);
var value= type==UtilConstants.StringType?(object)"": Activator.CreateInstance(type);
var dt = new Dictionary<string, object>();
dt.Add(columnInfo.DbColumnName, value);
this.Context.Updateable(dt)
.AS(tableName)
.Where($"{columnInfo.DbColumnName} is null ").ExecuteCommand();
UpdateColumn(tableName, columnInfo);
}
2017-06-17 21:15:58 +08:00
return true;
2017-01-07 21:54:51 +08:00
}
2017-06-18 04:15:09 +08:00
public virtual bool UpdateColumn(string tableName, DbColumnInfo column)
{
2017-06-25 19:16:10 +08:00
tableName = this.SqlBuilder.GetTranslationTableName(tableName);
2017-06-18 04:15:09 +08:00
string sql = GetUpdateColumnSql(tableName, column);
2017-06-17 23:50:28 +08:00
this.Context.Ado.ExecuteCommand(sql);
return true;
}
2018-02-08 17:44:23 +08:00
public abstract bool CreateTable(string tableName, List<DbColumnInfo> columns, bool isCreatePrimaryKey = true);
2017-06-17 23:08:50 +08:00
public virtual bool DropTable(string tableName)
2017-06-17 21:15:58 +08:00
{
2017-06-25 19:16:10 +08:00
tableName = this.SqlBuilder.GetTranslationTableName(tableName);
2017-07-19 00:31:27 +08:00
this.Context.Ado.ExecuteCommand(string.Format(this.DropTableSql, tableName));
2017-06-17 20:28:15 +08:00
return true;
}
2019-05-16 22:16:55 +08:00
public virtual bool TruncateTable<T>()
{
2019-05-17 20:34:53 +08:00
this.Context.InitMappingInfo<T>();
2019-05-16 22:16:55 +08:00
return this.TruncateTable(this.Context.EntityMaintenance.GetEntityInfo<T>().DbTableName);
}
2022-04-17 19:02:50 +08:00
public virtual bool TruncateTable<T,T2>()
{
TruncateTable<T>();
TruncateTable<T2>();
return true;
}
public virtual bool TruncateTable<T, T2,T3>()
{
TruncateTable<T>();
TruncateTable<T2>();
TruncateTable<T3>();
return true;
}
public virtual bool TruncateTable<T, T2, T3,T4>()
{
TruncateTable<T>();
TruncateTable<T2>();
TruncateTable<T3>();
TruncateTable<T4>();
return true;
}
2017-06-17 23:08:50 +08:00
public virtual bool DropColumn(string tableName, string columnName)
{
2017-06-25 19:16:10 +08:00
columnName = this.SqlBuilder.GetTranslationColumnName(columnName);
tableName = this.SqlBuilder.GetTranslationTableName(tableName);
2017-06-17 23:08:50 +08:00
this.Context.Ado.ExecuteCommand(string.Format(this.DropColumnToTableSql, tableName, columnName));
return true;
}
public virtual bool DropConstraint(string tableName, string constraintName)
{
2017-06-25 19:16:10 +08:00
tableName = this.SqlBuilder.GetTranslationTableName(tableName);
string sql = string.Format(this.DropConstraintSql, tableName, constraintName);
2017-06-17 23:08:50 +08:00
this.Context.Ado.ExecuteCommand(sql);
2017-06-17 21:45:17 +08:00
return true;
}
2017-01-07 21:54:51 +08:00
public virtual bool TruncateTable(string tableName)
{
2017-06-25 19:16:10 +08:00
tableName = this.SqlBuilder.GetTranslationTableName(tableName);
this.Context.Ado.ExecuteCommand(string.Format(this.TruncateTableSql, tableName));
2017-01-07 21:54:51 +08:00
return true;
}
2017-06-17 23:08:50 +08:00
public virtual bool BackupDataBase(string databaseName, string fullFileName)
2017-06-05 20:49:02 +08:00
{
2017-06-17 21:15:58 +08:00
var directory = FileHelper.GetDirectoryFromFilePath(fullFileName);
if (!FileHelper.IsExistDirectory(directory))
{
2017-06-17 20:28:15 +08:00
FileHelper.CreateDirectory(directory);
}
this.Context.Ado.ExecuteCommand(string.Format(this.BackupDataBaseSql, databaseName, fullFileName));
return true;
2017-06-07 13:33:24 +08:00
}
2017-06-18 04:15:09 +08:00
public virtual bool BackupTable(string oldTableName, string newTableName, int maxBackupDataRows = int.MaxValue)
2017-06-17 23:08:50 +08:00
{
2017-06-25 19:16:10 +08:00
oldTableName = this.SqlBuilder.GetTranslationTableName(oldTableName);
newTableName = this.SqlBuilder.GetTranslationTableName(newTableName);
2018-10-12 16:56:13 +08:00
string sql = string.Format(this.BackupTableSql, maxBackupDataRows, newTableName, oldTableName);
2017-06-17 23:08:50 +08:00
this.Context.Ado.ExecuteCommand(sql);
return true;
}
2017-06-18 04:15:09 +08:00
public virtual bool RenameColumn(string tableName, string oldColumnName, string newColumnName)
{
2017-06-25 19:16:10 +08:00
tableName = this.SqlBuilder.GetTranslationTableName(tableName);
oldColumnName = this.SqlBuilder.GetTranslationColumnName(oldColumnName);
newColumnName = this.SqlBuilder.GetTranslationColumnName(newColumnName);
2017-06-18 04:15:09 +08:00
string sql = string.Format(this.RenameColumnSql, tableName, oldColumnName, newColumnName);
this.Context.Ado.ExecuteCommand(sql);
return true;
}
2018-11-10 16:54:02 +08:00
public virtual bool AddColumnRemark(string columnName, string tableName, string description)
{
string sql = string.Format(this.AddColumnRemarkSql, columnName, tableName, description);
this.Context.Ado.ExecuteCommand(sql);
return true;
}
public virtual bool DeleteColumnRemark(string columnName, string tableName)
{
string sql = string.Format(this.DeleteColumnRemarkSql, columnName, tableName);
this.Context.Ado.ExecuteCommand(sql);
return true;
}
public virtual bool IsAnyColumnRemark(string columnName, string tableName)
{
string sql = string.Format(this.IsAnyColumnRemarkSql, columnName, tableName);
2018-11-11 12:47:10 +08:00
var dt=this.Context.Ado.GetDataTable(sql);
return dt.Rows!=null&&dt.Rows.Count>0;
2018-11-10 16:54:02 +08:00
}
2018-11-11 12:47:10 +08:00
public virtual bool AddTableRemark(string tableName, string description)
2018-11-10 16:54:02 +08:00
{
2019-05-06 15:22:57 +08:00
string sql = string.Format(this.AddTableRemarkSql,tableName, description);
2018-11-10 16:54:02 +08:00
this.Context.Ado.ExecuteCommand(sql);
return true;
}
2018-11-11 12:47:10 +08:00
public virtual bool DeleteTableRemark(string tableName)
2018-11-10 16:54:02 +08:00
{
2018-11-11 12:47:10 +08:00
string sql = string.Format(this.DeleteTableRemarkSql,tableName);
2018-11-10 16:54:02 +08:00
this.Context.Ado.ExecuteCommand(sql);
return true;
}
2018-11-11 12:47:10 +08:00
public virtual bool IsAnyTableRemark(string tableName)
2018-11-10 16:54:02 +08:00
{
2018-11-11 12:47:10 +08:00
string sql = string.Format(this.IsAnyTableRemarkSql, tableName);
var dt=this.Context.Ado.GetDataTable(sql);
return dt.Rows != null && dt.Rows.Count > 0;
2018-11-10 16:54:02 +08:00
}
public virtual bool AddDefaultValue(string tableName, string columnName, string defaultValue)
{
2019-05-28 19:37:10 +08:00
if (defaultValue == "''")
{
defaultValue = "";
}
string sql = string.Format(AddDefaultValueSql, tableName, columnName,defaultValue);
this.Context.Ado.ExecuteCommand(sql);
return true;
}
2020-11-02 15:43:24 +08:00
public virtual bool CreateIndex(string tableName, string[] columnNames, bool isUnique=false)
{
2022-04-13 23:38:12 +08:00
string sql = string.Format(CreateIndexSql,this.SqlBuilder.GetTranslationTableName(tableName),string.Join(",",columnNames.Select(it=>this.SqlBuilder.GetTranslationColumnName(it))), string.Join("_", columnNames) + this.Context.CurrentConnectionConfig.IndexSuffix, isUnique ? "UNIQUE" : "");
sql = sql.Replace("_" + this.SqlBuilder.SqlTranslationLeft, "_");
sql = sql.Replace( this.SqlBuilder.SqlTranslationRight+"_", "_");
2022-04-14 15:08:39 +08:00
sql = sql.Replace(this.SqlBuilder.SqlTranslationLeft+ this.SqlBuilder.SqlTranslationLeft, this.SqlBuilder.SqlTranslationLeft);
sql = sql.Replace(this.SqlBuilder.SqlTranslationRight + this.SqlBuilder.SqlTranslationRight, this.SqlBuilder.SqlTranslationRight);
this.Context.Ado.ExecuteCommand(sql);
return true;
}
2020-12-01 18:15:31 +08:00
public virtual bool CreateUniqueIndex(string tableName, string[] columnNames)
{
2022-04-13 23:38:12 +08:00
string sql = string.Format(CreateIndexSql, this.SqlBuilder.GetTranslationTableName(tableName), string.Join(",", columnNames.Select(it => this.SqlBuilder.GetTranslationColumnName(it))), string.Join("_", columnNames) + this.Context.CurrentConnectionConfig.IndexSuffix + "_Unique","UNIQUE" );
sql = sql.Replace("_" + this.SqlBuilder.SqlTranslationLeft, "_");
sql = sql.Replace(this.SqlBuilder.SqlTranslationRight + "_", "_");
2022-04-14 15:08:39 +08:00
sql = sql.Replace(this.SqlBuilder.SqlTranslationLeft + this.SqlBuilder.SqlTranslationLeft, this.SqlBuilder.SqlTranslationLeft);
sql = sql.Replace(this.SqlBuilder.SqlTranslationRight + this.SqlBuilder.SqlTranslationRight, this.SqlBuilder.SqlTranslationRight);
2020-12-01 18:15:31 +08:00
this.Context.Ado.ExecuteCommand(sql);
return true;
}
2022-03-14 10:52:11 +08:00
public virtual bool CreateIndex(string tableName, string[] columnNames, string IndexName, bool isUnique = false)
{
string sql = string.Format("CREATE {3} INDEX {2} ON {0}({1})", tableName, string.Join(",", columnNames), IndexName, isUnique ? "UNIQUE" : "");
this.Context.Ado.ExecuteCommand(sql);
return true;
}
public virtual bool IsAnyIndex(string indexName)
{
string sql = string.Format(this.IsAnyIndexSql, indexName);
return this.Context.Ado.GetInt(sql)>0;
}
2018-11-11 13:48:38 +08:00
public virtual bool AddRemark(EntityInfo entity)
{
var db = this.Context;
var columns = entity.Columns.Where(it => it.IsIgnore == false).ToList();
foreach (var item in columns)
{
if (item.ColumnDescription != null)
{
//column remak
if (db.DbMaintenance.IsAnyColumnRemark(item.DbColumnName, item.DbTableName))
{
db.DbMaintenance.DeleteColumnRemark(item.DbColumnName, item.DbTableName);
db.DbMaintenance.AddColumnRemark(item.DbColumnName, item.DbTableName, item.ColumnDescription);
}
else
{
db.DbMaintenance.AddColumnRemark(item.DbColumnName, item.DbTableName, item.ColumnDescription);
}
}
}
//table remak
if (entity.TableDescription != null)
{
if (db.DbMaintenance.IsAnyTableRemark(entity.DbTableName))
{
db.DbMaintenance.DeleteTableRemark(entity.DbTableName);
db.DbMaintenance.AddTableRemark(entity.DbTableName, entity.TableDescription);
}
else
{
db.DbMaintenance.AddTableRemark(entity.DbTableName, entity.TableDescription);
}
}
return true;
}
2019-02-03 18:01:10 +08:00
public virtual void AddIndex(EntityInfo entityInfo)
{
var db = this.Context;
var columns = entityInfo.Columns.Where(it => it.IsIgnore == false).ToList();
var indexColumns = columns.Where(it => it.IndexGroupNameList.HasValue()).ToList();
if (indexColumns.HasValue())
{
var groups = indexColumns.SelectMany(it => it.IndexGroupNameList).GroupBy(it => it).Select(it=>it.Key).ToList();
foreach (var item in groups)
{
var columnNames = indexColumns.Where(it => it.IndexGroupNameList.Any(i => i.Equals(item, StringComparison.CurrentCultureIgnoreCase))).Select(it=>it.DbColumnName).ToArray();
2021-01-16 18:35:56 +08:00
var indexName = string.Format("Index_{0}_{1}"+this.Context.CurrentConnectionConfig.IndexSuffix,entityInfo.DbTableName, string.Join("_", columnNames));
if (!IsAnyIndex(indexName))
{
CreateIndex(entityInfo.DbTableName, columnNames);
}
}
}
2020-12-01 18:15:31 +08:00
var uIndexColumns = columns.Where(it => it.UIndexGroupNameList.HasValue()).ToList();
if (uIndexColumns.HasValue())
{
var groups = uIndexColumns.SelectMany(it => it.UIndexGroupNameList).GroupBy(it => it).Select(it => it.Key).ToList();
foreach (var item in groups)
{
var columnNames = uIndexColumns.Where(it => it.UIndexGroupNameList.Any(i => i.Equals(item, StringComparison.CurrentCultureIgnoreCase))).Select(it => it.DbColumnName).ToArray();
2021-01-16 18:35:56 +08:00
var indexName = string.Format("Index_{0}_{1}_Unique" + this.Context.CurrentConnectionConfig.IndexSuffix, entityInfo.DbTableName, string.Join("_", columnNames));
2020-12-01 18:15:31 +08:00
if (!IsAnyIndex(indexName))
{
CreateUniqueIndex(entityInfo.DbTableName, columnNames);
}
}
}
}
protected virtual bool IsAnyDefaultValue(string tableName, string columnName,List<DbColumnInfo> columns)
{
var defaultValue = columns.Where(it => it.DbColumnName.Equals(columnName, StringComparison.CurrentCultureIgnoreCase)).First().DefaultValue;
return defaultValue.HasValue();
}
public virtual bool IsAnyDefaultValue(string tableName, string columnName)
{
return IsAnyDefaultValue(tableName, columnName, this.GetColumnInfosByTableName(tableName, false));
}
public virtual void AddDefaultValue(EntityInfo entityInfo)
{
var dbColumns=this.GetColumnInfosByTableName(entityInfo.DbTableName, false);
var db = this.Context;
var columns = entityInfo.Columns.Where(it => it.IsIgnore == false).ToList();
foreach (var item in columns)
{
if (item.DefaultValue.HasValue())
{
if (!IsAnyDefaultValue(entityInfo.DbTableName,item.DbColumnName,dbColumns))
{
this.AddDefaultValue(entityInfo.DbTableName, item.DbColumnName, item.DefaultValue);
}
}
}
}
2019-02-03 18:01:10 +08:00
public virtual bool RenameTable(string oldTableName, string newTableName)
{
string sql = string.Format(this.RenameTableSql, oldTableName,newTableName);
this.Context.Ado.ExecuteCommand(sql);
return true;
}
2017-06-05 20:49:02 +08:00
#endregion
2017-01-07 21:54:51 +08:00
#region Private
2021-12-20 13:53:46 +08:00
protected List<T> GetListOrCache<T>(string cacheKey, string sql)
2017-01-07 21:54:51 +08:00
{
2017-09-28 16:21:46 +08:00
return this.Context.Utilities.GetReflectionInoCacheInstance().GetOrCreate(cacheKey,
2017-09-28 15:50:14 +08:00
() =>
2017-01-07 21:54:51 +08:00
{
2017-05-19 11:20:07 +08:00
var isEnableLogEvent = this.Context.Ado.IsEnableLogEvent;
this.Context.Ado.IsEnableLogEvent = false;
2018-01-31 16:41:30 +08:00
var result = this.Context.Ado.SqlQuery<T>(sql);
2017-05-19 11:20:07 +08:00
this.Context.Ado.IsEnableLogEvent = isEnableLogEvent;
2018-01-31 16:41:30 +08:00
return result;
2017-01-07 21:54:51 +08:00
});
}
2017-06-24 02:15:35 +08:00
protected virtual string GetCreateTableSql(string tableName, List<DbColumnInfo> columns)
2017-06-17 21:45:17 +08:00
{
List<string> columnArray = new List<string>();
Check.Exception(columns.IsNullOrEmpty(), "No columns found ");
foreach (var item in columns)
{
2017-07-19 00:31:27 +08:00
string columnName = this.SqlBuilder.GetTranslationTableName(item.DbColumnName);
2017-06-17 21:45:17 +08:00
string dataType = item.DataType;
2017-08-26 01:57:24 +08:00
string dataSize = GetSize(item);
2017-06-17 21:45:17 +08:00
string nullType = item.IsNullable ? this.CreateTableNull : CreateTableNotNull;
2017-06-18 05:46:02 +08:00
string primaryKey = null;
2017-06-17 21:45:17 +08:00
string identity = item.IsIdentity ? this.CreateTableIdentity : null;
2017-07-19 00:31:27 +08:00
string addItem = string.Format(this.CreateTableColumn, columnName, dataType, dataSize, nullType, primaryKey, identity);
2017-06-17 21:45:17 +08:00
columnArray.Add(addItem);
}
2017-07-19 00:31:27 +08:00
string tableString = string.Format(this.CreateTableSql, this.SqlBuilder.GetTranslationTableName(tableName), string.Join(",\r\n", columnArray));
2017-06-17 21:45:17 +08:00
return tableString;
}
2017-06-24 02:15:35 +08:00
protected virtual string GetAddColumnSql(string tableName, DbColumnInfo columnInfo)
2017-06-17 21:45:17 +08:00
{
2017-07-19 00:31:27 +08:00
string columnName = this.SqlBuilder.GetTranslationColumnName(columnInfo.DbColumnName);
2017-06-25 19:16:10 +08:00
tableName = this.SqlBuilder.GetTranslationTableName(tableName);
2017-06-17 21:45:17 +08:00
string dataType = columnInfo.DataType;
2017-08-26 01:57:24 +08:00
string dataSize = GetSize(columnInfo);
2017-06-17 21:45:17 +08:00
string nullType = columnInfo.IsNullable ? this.CreateTableNull : CreateTableNotNull;
2017-06-18 05:29:42 +08:00
string primaryKey = null;
string identity = null;
2017-06-17 21:45:17 +08:00
string result = string.Format(this.AddColumnToTableSql, tableName, columnName, dataType, dataSize, nullType, primaryKey, identity);
return result;
}
2017-06-24 02:15:35 +08:00
protected virtual string GetUpdateColumnSql(string tableName, DbColumnInfo columnInfo)
2017-06-17 23:50:28 +08:00
{
2019-05-31 16:27:12 +08:00
string columnName = this.SqlBuilder.GetTranslationColumnName(columnInfo.DbColumnName);
2017-06-25 19:16:10 +08:00
tableName = this.SqlBuilder.GetTranslationTableName(tableName);
2017-08-26 01:57:24 +08:00
string dataSize = GetSize(columnInfo);
2018-05-05 16:49:35 +08:00
string dataType = columnInfo.DataType;
2017-06-17 23:50:28 +08:00
string nullType = columnInfo.IsNullable ? this.CreateTableNull : CreateTableNotNull;
2017-06-18 04:15:09 +08:00
string primaryKey = null;
string identity = null;
2017-06-17 23:50:28 +08:00
string result = string.Format(this.AlterColumnToTableSql, tableName, columnName, dataType, dataSize, nullType, primaryKey, identity);
return result;
}
2017-07-19 00:31:27 +08:00
protected virtual string GetCacheKey(string cacheKey)
{
2017-08-26 01:57:24 +08:00
return this.Context.CurrentConnectionConfig.DbType + "." + this.Context.Ado.Connection.Database + "." + cacheKey;
2017-07-19 00:31:27 +08:00
}
2017-08-26 02:05:23 +08:00
protected virtual string GetSize(DbColumnInfo item)
{
string dataSize = null;
var isMax = item.Length > 4000 || item.Length == -1;
if (isMax)
{
dataSize = item.Length > 0 ? string.Format("({0})", "max") : null;
}
2018-05-05 16:49:35 +08:00
else if (item.Length == 0 && item.DecimalDigits > 0)
{
item.Length = 10;
dataSize = string.Format("({0},{1})", item.Length, item.DecimalDigits);
}
2017-08-26 02:05:23 +08:00
else if (item.Length > 0 && item.DecimalDigits == 0)
{
dataSize = item.Length > 0 ? string.Format("({0})", item.Length) : null;
}
else if (item.Length > 0 && item.DecimalDigits > 0)
{
dataSize = item.Length > 0 ? string.Format("({0},{1})", item.Length, item.DecimalDigits) : null;
}
return dataSize;
}
2017-01-07 21:54:51 +08:00
#endregion
}
}