2022-09-20 03:10:29 +00:00
using Api.Framework.Model ;
using SqlSugar ;
using System ;
using System.Collections.Generic ;
using System.ComponentModel ;
using System.Linq ;
using System.Reflection ;
using System.Text ;
using System.Text.RegularExpressions ;
using System.Threading ;
using System.Threading.Tasks ;
2022-09-22 03:39:51 +00:00
using Api.Framework.Utils ;
2022-09-20 03:10:29 +00:00
namespace Api.Framework.Tools
{
/// <summary>
/// 持久层线程池
/// </summary>
public class SessionThreadLocal
{
private static ThreadLocal < SqlSugarClient > m_SessionLocal = new ThreadLocal < SqlSugarClient > ( ) ;
/// <summary>
/// 设置持久层到线程池
/// </summary>
/// <param name="session"></param>
public static void Set ( SqlSugarClient session )
{
m_SessionLocal . Value = session ;
}
/// <summary>
/// 从线程池获取持久层
/// </summary>
/// <returns></returns>
public static SqlSugarClient Get ( )
{
return m_SessionLocal . Value ;
}
/// <summary>
/// 清空线程池
/// </summary>
public static void Clear ( )
{
foreach ( var item in m_SessionLocal . Values )
{
item . Close ( ) ;
item . Dispose ( ) ;
}
m_SessionLocal . Value = null ;
}
}
/// <summary>
/// 数据库链接配置
/// </summary>
public class ConnectionConfig
{
/// <summary>
/// 数据库连接信息
/// </summary>
public string ConnectionString { get ; set ; }
/// <summary>
/// 数据库类型
/// </summary>
public DatabaseType DatabaseType { get ; set ; }
}
/// <summary>
/// 数据库类型枚举,需要扩展类型可在此添加
/// </summary>
public enum DatabaseType : int
{
/// <summary>
/// MSSQL数据库
/// </summary>
[Description("MSSQL数据库")]
SQLSERVER = 1 ,
/// <summary>
/// ORACLE数据库
/// </summary>
[Description("ORACLE数据库")]
ORACLE = 2 ,
/// <summary>
/// ACCESS数据库
/// </summary>
[Description("ACCESS数据库")]
ACCESS = 3 ,
/// <summary>
/// MYSQL数据库
/// </summary>
[Description("MYSQL数据库")]
MYSQL = 4 ,
/// <summary>
/// SQLITE数据库
/// </summary>
[Description("SQLITE数据库")]
SQLITE = 5
}
/// <summary>
/// 数据库基础类
/// </summary>
public class base_model
{
[SugarColumn(IsPrimaryKey = true, IsIdentity = true), Browsable(false), ReadOnly(false)]
public long id { get ; set ; }
}
/// <summary>
/// 分页查询结果
/// </summary>
/// <typeparam name="T">数据库表实体类</typeparam>
public class PageResult < T >
{
/// <summary>
/// 分页查询中总记录数
/// </summary>
public int Total { get ; set ; }
/// <summary>
/// 分页查询中结果集合
/// </summary>
public List < T > DataList { get ; set ; }
}
public class ParamMap
{
public List < SugarParameter > SugarParameters { get ; private set ; }
public bool ContainsKey ( string name )
{
return this . SugarParameters . FirstOrDefault ( f = > f . ParameterName = = name ) ! = null ? true : false ;
}
public ParamMap ( )
{
OrderBySQL = string . Empty ;
SugarParameters = new List < SugarParameter > ( ) ;
}
public void setParameter ( string name , object value )
{
SugarParameters . Add ( new SqlSugar . SugarParameter ( name , value ) ) ;
}
public int Index { get ; private set ; }
public int PageSize { get ; private set ; }
public void setPageParamters ( int index , int pagesize )
{
this . Index = index ;
this . PageSize = pagesize ;
}
public string OrderBySQL { get ; private set ; }
/// <summary>
/// 设置排序字段及排序方式
/// </summary>
/// <param name="orderFields">排序字段</param>
/// <param name="isDesc">是否为递减排序</param>
public void setOrderFields ( string orderFields , bool isDesc )
{
OrderBySQL = $" Order by {orderFields} " + ( isDesc ? "desc" : "asc" ) + " " ;
}
}
public static class SqlSugarExtend
{
public static PageResult < T > FindPage < T > ( this SqlSugarClient session , string sql , ParamMap map )
{
string _temp = string . Empty ;
if ( session . CurrentConnectionConfig . DbType = = DbType . Sqlite )
{
_temp = $" limit {map.PageSize} offset {map.PageSize * (map.Index - 1)}" ;
}
else if ( session . CurrentConnectionConfig . DbType = = DbType . MySql )
{
_temp = $" limit {map.PageSize * (map.Index - 1)},{map.PageSize}" ;
}
//foreach (SugarParameter item in map.SugarParameters)
//{
// sql = sql.Replace("@"+item.ParameterName,$"");
//}
PageResult < T > result = new PageResult < T > ( ) ;
result . DataList = session . Ado . SqlQuery < T > ( sql + map . OrderBySQL + _temp , map . SugarParameters ) ;
//var reg = Regex.Matches(sql, @"(select [\w\W]+ from)");
//if (reg.Count > 0)
//{
//}
//var temp = Regex.Replace(sql, @"^select [\w\W]+ from", "select count(*) as count from");
var start_index = sql . IndexOf ( "from" ) ;
var temp_sql = "select count(*) as count " + sql . Substring ( start_index ) ;
result . Total = int . Parse ( session . FindRow ( temp_sql , map . SugarParameters ) [ "count" ] . ToString ( ) ) ;
return result ;
}
public static ParamMap NewParamMap ( this SqlSugarClient session )
{
return new ParamMap ( ) ;
}
/// <summary>
/// 创建表
/// </summary>
/// <param name="type"></param>
public static void CreateTable ( this SqlSugarClient session , Type type )
{
//session.CodeFirst.BackupTable().InitTables(type);
//获取公共属性
PropertyInfo [ ] Propertys = type . GetProperties ( ) ;
if ( Propertys . Length = = 1 ) throw new Exception ( "字段最少需要2个。" ) ;
StringBuilder sb = new StringBuilder ( ) ;
sb . Append ( "CREATE TABLE " ) ;
sb . Append ( type . Name ) ;
sb . Append ( "(" ) ;
int number = 0 ;
foreach ( var item in Propertys )
{
string _name = $"`{item.Name}`" ;
if ( _name = = "interval" )
_name = $"`{_name}`" ;
string _type = string . Empty ;
bool _primary = false ;
var _unique = " " ;
var _attribute = item . GetCustomAttributes ( ) . FirstOrDefault ( f = > f . GetType ( ) = = typeof ( SugarColumn ) ) as SugarColumn ;
if ( _attribute ! = null )
{
_name = _attribute . ColumnName ;
//_type = _attribute.ty;
_primary = _attribute . IsPrimaryKey ;
// _unique = _attribute.IsUnique ? " unique " : " ";
}
if ( string . IsNullOrEmpty ( _name ) ) _name = item . Name ;
number + + ;
sb . Append ( _name ) ;
if ( item . Name . ToLower ( ) = = "id" | | _primary )
{
//sb.Append(" integer(11) primary key 自增 not null ");
sb . Append ( " integer primary key 自增 not null " ) ;
}
else if ( ! string . IsNullOrEmpty ( _type ) )
{
sb . Append ( " " + _type + _unique ) ;
}
else
{
sb . Append ( " " ) ;
//if (item.PropertyType.FullName == typeof(Int32).ToString() || item.PropertyType.FullName == typeof(Int16).ToString() || item.PropertyType.FullName == typeof(UInt16).ToString() || item.PropertyType.FullName == typeof(Int64).ToString())
if ( item . PropertyType . FullName = = typeof ( Int32 ) . ToString ( ) | | item . PropertyType . FullName = = typeof ( Int16 ) . ToString ( ) | | item . PropertyType . FullName = = typeof ( UInt16 ) . ToString ( ) )
sb . Append ( " integer(11) default 0 " + _unique ) ;
else if ( item . PropertyType . FullName = = typeof ( Int64 ) . ToString ( ) )
sb . Append ( " bigint(11) default 0 " + _unique ) ;
else if ( typeof ( DateTime ) . ToString ( ) = = item . PropertyType . FullName )
2022-11-23 16:02:32 +00:00
sb . Append ( " datetime " + _unique ) ;
2022-09-20 03:10:29 +00:00
else if ( typeof ( String ) . ToString ( ) = = item . PropertyType . FullName )
{
2022-11-25 08:12:22 +00:00
var nameTmp = _name . Replace ( "`" , "" ) ;
if ( nameTmp . ToUpper ( ) = = "message" . ToUpper ( ) | |
nameTmp . ToUpper ( ) = = "answer" . ToUpper ( ) | |
nameTmp . ToUpper ( ) = = "token" . ToUpper ( ) | |
nameTmp . ToUpper ( ) = = "dicvalue" . ToUpper ( ) | |
nameTmp . ToUpper ( ) = = "ExtInfo" . ToUpper ( ) | |
nameTmp . ToUpper ( ) = = "Signature" . ToUpper ( ) | |
nameTmp . ToUpper ( ) = = "adzones" . ToUpper ( ) | |
nameTmp . ToUpper ( ) = = "data" . ToUpper ( ) | |
nameTmp . ToUpper ( ) = = "device_info" . ToUpper ( ) | |
nameTmp . ToUpper ( ) . EndsWith ( "_text" . ToUpper ( ) ) | |
nameTmp . ToUpper ( ) . EndsWith ( "dic" . ToUpper ( ) ) )
2022-09-20 03:10:29 +00:00
{
2022-11-20 14:49:22 +00:00
if ( session . CurrentConnectionConfig . DbType = = DbType . MySql & & nameTmp . ToUpper ( ) . EndsWith ( "dic" . ToUpper ( ) ) )
2022-09-20 03:10:29 +00:00
{
sb . Append ( " longtext " + _unique ) ;
}
else
sb . Append ( " text " + _unique ) ;
}
else
sb . Append ( " varchar(" + ( _attribute = = null ? 255 : ( _attribute . Length = = 0 ? 255 : _attribute . Length ) ) + ") default ''" + _unique ) ;
}
else if ( item . PropertyType . FullName = = typeof ( Char ) . ToString ( ) )
sb . Append ( " varchar(2) default ''" + _unique ) ;
else if ( item . PropertyType . FullName = = typeof ( Boolean ) . ToString ( ) )
sb . Append ( " boolean " + _unique ) ;
else if ( item . PropertyType . FullName = = typeof ( Double ) . ToString ( ) )
sb . Append ( " double default 0.00" + _unique ) ;
else
{
if ( item . PropertyType . BaseType . Name = = "Enum" )
{
sb . Append ( " integer default 0 " + _unique ) ;
}
else
{
throw new Exception ( "不支持" + item . PropertyType . FullName + "字段,请联系框架设计师处理。" ) ;
}
}
}
if ( number ! = Propertys . Length )
{
sb . Append ( "," ) ;
}
}
sb . Append ( ");" ) ;
string sql = sb . ToString ( ) ;
if ( sql . Contains ( "自增" ) )
{
if ( session . CurrentConnectionConfig . DbType = = DbType . Sqlite )
{
sql = sql . Replace ( "自增" , "AUTOINCREMENT" ) . Replace ( "AUTO_INCREMENT" , "AUTOINCREMENT" ) ;
}
else if ( session . CurrentConnectionConfig . DbType = = DbType . MySql )
{
sql = sql . Replace ( "自增" , "AUTO_INCREMENT" ) . Replace ( "AUTOINCREMENT" , "AUTO_INCREMENT" ) ;
}
}
session . ExcuteSQL ( sql ) ;
}
public static void CreateTable < T > ( this SqlSugarClient session )
{
session . CreateTable ( typeof ( T ) ) ;
}
public static void Update ( this SqlSugarClient session , base_model model , object param = null )
{
StringBuilder sb = new StringBuilder ( "update " + model . GetType ( ) . Name + " set " ) ;
ParamMap map = session . NewParamMap ( ) ;
if ( param ! = null )
{
PropertyInfo [ ] propertys = param . GetType ( ) . GetProperties ( ) ;
int number = 0 ;
foreach ( System . Reflection . PropertyInfo p in propertys )
{
number + + ;
sb . Append ( p . Name + "=@" + p . Name ) ;
map . setParameter ( p . Name , p . GetValue ( param ) ) ;
if ( propertys . Length ! = number ) sb . Append ( "," ) ;
}
map . setParameter ( "id" , model . id ) ;
sb . Append ( " where id=@id;" ) ;
}
}
public static bool IndexExist < T > ( this SqlSugarClient session , params object [ ] values )
{
return IndexExist ( session , typeof ( T ) . Name , values ) ;
}
public static bool IndexExist ( this SqlSugarClient session , string tableName , params object [ ] values )
{
var indexName = tableName + "__" + string . Join ( "_" , values ) ;
if ( indexName . Length > 64 )
indexName = indexName . Substring ( 0 , 64 ) ;
if ( session . CurrentConnectionConfig . DbType = = DbType . MySql )
{
var db_name = string . Empty ;
var reg = Regex . Match ( session . CurrentConnectionConfig . ConnectionString , "Data Source=(?<db_host>.*?);Initial Catalog=(?<db_name>.*?);Persist Security Info=True;User ID=(?<db_user>.*?);Password=(?<db_pass>.*?);Port=(?<db_port>.*?);" ) ;
if ( reg . Success )
db_name = reg . Groups [ "db_name" ] . ToString ( ) ;
var row = session . FindRow ( "SELECT * FROM information_schema.statistics WHERE table_schema = @db_name and table_name = @tableName AND index_name = @indexName" , new { db_name = db_name , tableName = tableName , indexName = indexName } ) ;
if ( row ! = null ) return true ;
}
else if ( session . CurrentConnectionConfig . DbType = = DbType . Sqlite )
{
var row = session . FindRow ( "SELECT * FROM sqlite_master WHERE type = 'index' and tbl_name = @tableName and name = @indexName" , new { tableName = tableName , indexName = indexName } ) ;
if ( row ! = null ) return true ;
}
return false ;
}
/// <summary>
/// 索引是否存在
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="session"></param>
/// <param name="indexName"></param>
/// <returns></returns>
public static bool IndexExist < T > ( this SqlSugarClient session , string indexName )
{
return IndexExist ( session , typeof ( T ) . Name , indexName ) ;
}
/// <summary>
/// 索引是否存在
/// </summary>
/// <param name="session"></param>
/// <param name="tableName"></param>
/// <param name="indexName"></param>
/// <returns></returns>
public static bool IndexExist ( this SqlSugarClient session , string tableName , string indexName )
{
if ( session . CurrentConnectionConfig . DbType = = DbType . MySql )
{
var db_name = string . Empty ;
var reg = Regex . Match ( session . CurrentConnectionConfig . ConnectionString , "Data Source=(?<db_host>.*?);Initial Catalog=(?<db_name>.*?);Persist Security Info=True;User ID=(?<db_user>.*?);Password=(?<db_pass>.*?);Port=(?<db_port>.*?);" ) ;
if ( reg . Success )
db_name = reg . Groups [ "db_name" ] . ToString ( ) ;
2022-09-22 03:39:51 +00:00
var row = session . FindRow ( "SELECT * FROM information_schema.statistics WHERE table_schema = @db_name and table_name = @tableName AND index_name = @indexName" , new { db_name = db_name , tableName = tableName , indexName = tableName + "__" + indexName } ) ;
2022-09-20 03:10:29 +00:00
if ( row ! = null ) return true ;
}
else if ( session . CurrentConnectionConfig . DbType = = DbType . Sqlite )
{
var row = session . FindRow ( "SELECT * FROM sqlite_master WHERE type = 'index' and tbl_name = @tableName and name = @indexName" , new { tableName = tableName , indexName = indexName } ) ;
if ( row ! = null ) return true ;
}
return false ;
}
/// <summary>
/// 添加索引
/// </summary>
public static bool AddIndex < T > ( this SqlSugarClient session , params object [ ] values )
{
try
{
string tableName = typeof ( T ) . Name ;
string sql = string . Empty ;
var indexName = tableName + "__" + string . Join ( "_" , values ) ;
if ( indexName . Length > 64 )
indexName = indexName . Substring ( 0 , 64 ) ;
2022-09-22 03:39:51 +00:00
2022-09-20 03:10:29 +00:00
if ( session . CurrentConnectionConfig . DbType = = DbType . Sqlite )
sql = $" CREATE INDEX {indexName} ON {tableName} ({string.Join(" , ", values)});" ;
else if ( session . CurrentConnectionConfig . DbType = = DbType . MySql )
sql = $"ALTER TABLE {tableName} ADD INDEX {indexName}({string.Join(" , ", values)});" ;
else throw new Exception ( "暂时不支持" + session . CurrentConnectionConfig . DbType + "数据库!" ) ;
session . ExcuteSQL ( sql ) ;
return true ;
}
catch ( Exception ex )
{
Console . WriteLine ( "创建索引失败:" + ex . Message ) ;
}
return false ;
}
public static bool DeleteIndex ( this SqlSugarClient session , string tableName , string indexName )
{
if ( session . CurrentConnectionConfig . DbType = = DbType . MySql )
{
session . ExcuteSQL ( $"DROP INDEX {indexName} ON {tableName}" ) ;
}
else if ( session . CurrentConnectionConfig . DbType = = DbType . Sqlite )
{
session . ExcuteSQL ( $"DROP INDEX {indexName}" ) ;
}
return ! session . IndexExist ( tableName , indexName ) ;
}
/// <summary>
/// 判断表是否存在
/// </summary>
/// <typeparam name="T"></typeparam>
/// <returns></returns>
public static bool TableExist < T > ( this SqlSugarClient session )
{
return TableExist ( session , typeof ( T ) . Name ) ;
}
/// <summary>
/// 判断表是否存在
/// </summary>
public static bool TableExist ( this SqlSugarClient session , string tableName )
{
if ( session . CurrentConnectionConfig . DbType = = DbType . Sqlite )
{
var result = session . Ado . GetDataTable ( "SELECT * FROM sqlite_master where type='table' and name=@tableName;" , new { tableName = tableName } ) ;
if ( result . Rows . Count = = 0 ) return false ;
}
else if ( session . CurrentConnectionConfig . DbType = = DbType . MySql )
{
//var result = session.Ado.GetDataTable("select TABLE_NAME from INFORMATION_SCHEMA.TABLES where TABLE_SCHEMA=@dbName and TABLE_NAME=@tableName ;", new { tableName = Regex.Match(session.CurrentConnectionConfig.ConnectionString, "Initial Catalog=(.*?);").Groups[1].Value });
var result = session . Ado . GetDataTable ( "select * from information_schema.TABLES where TABLE_SCHEMA=(select database()) and `table_name` =@tableName" , new { tableName = tableName } ) ;
if ( result . Rows . Count = = 0 ) return false ;
else
{
//SELECT table_name FROM information_schema.TABLES WHERE table_name ='fl_plugin_pddrebate_pddtgw';
result = session . Ado . GetDataTable ( "SELECT table_name FROM information_schema.TABLES WHERE table_name = @tableName" , new { tableName = tableName } ) ;
if ( result . Rows . Count = = 0 ) return false ;
}
}
else return false ;
return true ;
}
/// <summary>
/// 添加唯一约束
/// </summary>
public static void AddUnique < T > ( this SqlSugarClient session , params object [ ] values )
{
AddUnique ( session , typeof ( T ) . Name , values ) ;
}
/// <summary>
/// 执行sql
/// </summary>
/// <param name="session"></param>
/// <param name="sql"></param>
/// <param name="parameters"></param>
public static void ExcuteSQL ( this SqlSugarClient session , string sql , object parameters = null )
{
session . Ado . ExecuteCommand ( sql , parameters ) ;
}
public static bool ExistUnique ( this SqlSugarClient session , string tableName , params object [ ] values )
{
if ( session . CurrentConnectionConfig . DbType = = DbType . Sqlite )
{
return false ;
}
else if ( session . CurrentConnectionConfig . DbType = = DbType . MySql )
{
//SELECT count(*) FROM INFORMATION_SCHEMA.KEY_COLUMN_USAGE where table_name = 'fl_statistics_record' and column_name = 'uid'
//var result = session.Ado.GetDataTable("SELECT count(*) FROM INFORMATION_SCHEMA.KEY_COLUMN_USAGE where table_name = @tableName and column_name = @column_name", new { tableName = tableName, column_name = columnName });
StringBuilder strb = new StringBuilder ( $"SELECT * FROM INFORMATION_SCHEMA.KEY_COLUMN_USAGE where table_name = @tableName and CONSTRAINT_NAME = '{values[0]}'" ) ;
//List<string> ors = new List<string>();
//for (int i = 0; i < values.Length; i++)
//{
// ors.Add($"column_name = '{values[i]}'");
//}
//strb.Append($"({string.Join(" or ", ors)});");
var result = session . Ado . GetDataTable ( strb . ToString ( ) , new { tableName = tableName } ) ;
var rows = result . Rows ;
if ( rows . Count = = 0 )
return false ;
List < string > strs = new List < string > ( ) ;
foreach ( System . Data . DataRow row in rows )
{
var item = row [ "column_name" ] ;
strs . Add ( item . ToString ( ) ) ;
}
string [ ] strs2 = new string [ values . Length ] ;
values . CopyTo ( strs2 , 0 ) ;
var notchongfu = strs . Except ( strs2 . ToList ( ) ) . ToList ( ) ;
return notchongfu . Count = = 0 ;
}
return true ;
}
public static bool DeleteUnique ( this SqlSugarClient session , string tableName , params object [ ] values )
{
try
{
if ( values = = null ) throw new Exception ( "Unique 不能为空。" ) ;
StringBuilder sb = new StringBuilder ( ) ;
if ( session . CurrentConnectionConfig . DbType = = DbType . Sqlite )
{
sb . Append ( " drop index " ) ;
sb . Append ( tableName ) ;
foreach ( var item in values )
{
sb . Append ( "_" ) ;
sb . Append ( item ) ;
sb . Append ( "_" ) ;
}
}
else if ( session . CurrentConnectionConfig . DbType = = DbType . MySql )
{
try
{
sb . Append ( "ALTER TABLE " ) ;
sb . Append ( tableName ) ;
sb . Append ( " drop index " ) ;
for ( int i = 0 ; i < values . Length ; i + + )
{
sb . Append ( values [ i ] ) ;
if ( ( i + 1 ) ! = values . Length )
{
sb . Append ( "," ) ;
}
}
sb . Append ( ";" ) ;
session . Ado . ExecuteCommand ( sb . ToString ( ) ) ;
return true ;
}
catch ( Exception )
{
sb . Length = 0 ;
sb . Append ( "ALTER TABLE " ) ;
sb . Append ( tableName ) ;
sb . Append ( " drop index " ) ;
if ( values . Length ! = 0 )
{
sb . Append ( values [ 0 ] ) ;
}
sb . Append ( ";" ) ;
session . Ado . ExecuteCommand ( sb . ToString ( ) ) ;
return true ;
}
}
else throw new Exception ( "暂时不支持" + session . CurrentConnectionConfig . DbType + "数据库!" ) ;
session . Ado . ExecuteCommand ( sb . ToString ( ) ) ;
return true ;
}
catch ( Exception ex )
{ }
return false ;
}
/// <summary>
/// 添加唯一约束
/// </summary>
public static void AddUnique ( this SqlSugarClient session , string tableName , params object [ ] values )
{
if ( values = = null ) throw new Exception ( "Unique 不能为空。" ) ;
StringBuilder sb = new StringBuilder ( ) ;
if ( session . CurrentConnectionConfig . DbType = = DbType . Sqlite )
{
sb . Append ( " CREATE UNIQUE INDEX " ) ;
sb . Append ( tableName ) ;
foreach ( var item in values )
{
sb . Append ( "_" ) ;
sb . Append ( item ) ;
sb . Append ( "_" ) ;
}
sb . Append ( " ON " ) ;
sb . Append ( tableName ) ;
sb . Append ( "(" ) ;
for ( int i = 0 ; i < values . Length ; i + + )
{
sb . Append ( values [ i ] ) ;
if ( ( i + 1 ) ! = values . Length )
{
sb . Append ( "," ) ;
}
}
sb . Append ( ");" ) ;
}
else if ( session . CurrentConnectionConfig . DbType = = DbType . MySql )
{
if ( session . ExistUnique ( tableName , values ) )
return ;
sb . Append ( "ALTER TABLE " ) ;
sb . Append ( tableName ) ;
sb . Append ( " ADD UNIQUE KEY(" ) ;
for ( int i = 0 ; i < values . Length ; i + + )
{
sb . Append ( values [ i ] ) ;
if ( ( i + 1 ) ! = values . Length )
{
sb . Append ( "," ) ;
}
}
sb . Append ( ");" ) ;
}
else throw new Exception ( "暂时不支持" + session . CurrentConnectionConfig . DbType + "数据库!" ) ;
session . Ado . ExecuteCommand ( sb . ToString ( ) ) ;
}
/// <summary>
/// 检测列是否存在
/// </summary>
/// <param name="session"></param>
/// <param name="tableName"></param>
/// <param name="columnName"></param>
/// <returns></returns>
public static bool ColumnExist ( this SqlSugarClient session , string tableName , string columnName )
{
//IF NOT EXISTS (SELECT * FROM information_schema.columns WHERE table_schema = DATABASE() AND table_name = 'vrv_paw_rule' AND column_name = 'thresholdMin') THEN
//ALTER TABLE vrv_paw_rule ADD COLUMN thresholdMin BIGINT;
if ( session . CurrentConnectionConfig . DbType = = DbType . Sqlite )
{
var row = session . FindRow ( "select * from sqlite_master where name = @tableName and sql like @colunName;" , new { tableName = tableName , colunName = "%" + columnName + "%" } ) ;
{
if ( row ! = null )
{
string sql = row [ "sql" ] . ToString ( ) . ToLower ( ) ;
//var reg = Regex.Match(sql, @",?'?\s{0,}\[?""?" + columnName.ToLower() + @"""?\]?'?\s{1,}", RegexOptions.IgnoreCase);
var reg = Regex . Match ( sql , @",?'?\s{0,}\[?""?" + columnName . ToLower ( ) + @"""?\]?'?\s{1,}" , RegexOptions . IgnoreCase ) ;
if ( reg . Success ) return true ;
else return false ;
//return true;
}
}
}
else if ( session . CurrentConnectionConfig . DbType = = DbType . MySql )
{
var row = session . FindRow ( "select * from information_schema.columns where table_schema = DATABASE() and table_name = @tableName and column_name like @colunName;" , new { tableName = tableName , colunName = "%" + columnName + "%" } ) ;
if ( row ! = null ) return true ;
}
return false ;
}
/// <summary>
/// 增加列
/// </summary>
/// <param name="session"></param>
/// <param name="tableName"></param>
/// <param name="columnName"></param>
/// <param name="sqlType"></param>
public static void AddColumn ( this SqlSugarClient session , string tableName , string columnName , string sqlType )
{
try
{
if ( session . CurrentConnectionConfig . DbType = = DbType . Sqlite ) session . ExcuteSQL ( "alter table " + tableName + " add " + columnName + " " + sqlType ) ;
else if ( session . CurrentConnectionConfig . DbType = = DbType . MySql ) session . ExcuteSQL ( "alter table " + tableName + " add column " + columnName + " " + sqlType ) ;
}
catch ( Exception ex )
{
2022-09-22 03:39:51 +00:00
LogHelper . GetSingleObj ( ) . Error ( "启动表字段检测" , $"增加字段异常:{ex.Message} - {tableName} - {columnName} - {sqlType}" ) ;
2022-09-20 03:10:29 +00:00
}
}
/// <summary>
/// 修改字段类型
/// </summary>
/// <param name="session"></param>
/// <param name="tableName"></param>
/// <param name="cloumnName"></param>
/// <param name="newType"></param>
public static void UpdateColumnType ( this SqlSugarClient session , string tableName , string cloumnName , string newType )
{
if ( session . CurrentConnectionConfig . DbType = = DbType . MySql )
session . ExcuteSQL ( "alter table " + tableName + " modify column " + cloumnName + " " + newType + ";" ) ;
}
/// <summary>
/// 获得第一条数据
/// </summary>
/// <param name="session"></param>
/// <param name="strSQL"></param>
/// <param name="obj"></param>
/// <returns></returns>
public static System . Data . DataRow FindRow ( this SqlSugarClient session , string strSQL , Object obj )
{
if ( session . CurrentConnectionConfig . DbType = = SqlSugar . DbType . MySql )
{
strSQL = strSQL . Replace ( "[随机排序]" , " order by rand() " ) ;
}
else
{
strSQL = strSQL . Replace ( "[随机排序]" , " order by RANDOM() " ) ;
}
//获取公共属性
var table = session . Ado . GetDataTable ( strSQL , obj ) ;
if ( table . Rows . Count > 0 ) return table . Rows [ 0 ] ;
return null ;
}
/// <summary>
/// 获得Table
/// </summary>
/// <param name="session"></param>
/// <param name="strSQL">SQL</param>
/// <param name="param"></param>
/// <returns></returns>
public static System . Data . DataTable FindTable ( this SqlSugarClient session , string strSQL , object param = null )
{
return session . Ado . GetDataTable ( strSQL , param ) ;
}
/// <summary>
/// 根据ID查数据、必须有为ID的字段
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="session"></param>
/// <param name="id"></param>
/// <returns></returns>
public static T FindById < T > ( this SqlSugarClient session , long id ) where T : new ( )
{
return session . Queryable < T > ( ) . InSingle ( 2 ) ;
}
public static int Insertable ( this SqlSugarClient session , base_model obj )
{
var t = obj . GetType ( ) ;
return session . Insertable ( obj ) . ExecuteReturnIdentity ( ) ;
}
public static List < T > Find < T > ( this SqlSugarClient session , string strSQL , Object param = null ) where T : new ( )
{
var tablename = typeof ( T ) . Name ;
if ( ! strSQL . StartsWith ( "select" ) )
{
StringBuilder sb = new StringBuilder ( ) ;
sb . Append ( "select * from " ) ;
sb . Append ( tablename ) ;
sb . Append ( " where " ) ;
sb . Append ( strSQL ) ;
strSQL = sb . ToString ( ) ;
}
if ( session . CurrentConnectionConfig . DbType = = DbType . MySql )
{
strSQL = strSQL . Replace ( "[随机排序]" , " order by rand() " ) ;
}
else
{
strSQL = strSQL . Replace ( "[随机排序]" , " order by RANDOM() " ) ;
}
return session . Ado . SqlQuery < T > ( strSQL , param ) ;
}
public static T FindSingle < T > ( this SqlSugarClient session , string strSQL , Object param = null ) where T : new ( )
{
for ( int i = 0 ; i < 5 ; i + + )
{
var tablename = typeof ( T ) . Name ;
if ( ! strSQL . StartsWith ( "select" , StringComparison . OrdinalIgnoreCase ) )
{
StringBuilder sb = new StringBuilder ( ) ;
sb . Append ( "select * from " ) ;
sb . Append ( tablename ) ;
sb . Append ( " where " ) ;
sb . Append ( strSQL ) ;
strSQL = sb . ToString ( ) ;
}
if ( session . CurrentConnectionConfig . DbType = = DbType . MySql )
{
strSQL = strSQL . Replace ( "[随机排序]" , " order by rand() " ) ;
}
else
{
strSQL = strSQL . Replace ( "[随机排序]" , " order by RANDOM() " ) ;
}
return session . Ado . SqlQuerySingle < T > ( strSQL , param ) ;
}
return default ( T ) ;
}
/// <summary>
/// 删除表
/// </summary>
/// <param name="session"></param>
/// <param name="tableName"></param>
public static void DropTable ( this SqlSugarClient session , string tableName )
{
session . ExcuteSQL ( "DROP TABLE " + tableName ) ;
}
/// <summary>
/// 删除表
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="session"></param>
public static void DropTable < T > ( this SqlSugarClient session )
{
string table_name = typeof ( T ) . Name ;
session . DropTable ( table_name ) ;
}
/// <summary>
/// 开启事务
/// </summary>
/// <param name="session"></param>
public static void BeginTransaction ( this SqlSugarClient session )
{
session . Ado . BeginTran ( ) ;
}
/// <summary>
/// 回滚
/// </summary>
/// <param name="session"></param>
public static void Rollback ( this SqlSugarClient session )
{
session . Ado . RollbackTran ( ) ;
}
/// <summary>
/// 提交
/// </summary>
/// <param name="session"></param>
public static void Commit ( this SqlSugarClient session )
{
session . Ado . CommitTran ( ) ;
}
}
}