using System; using System.Collections.Generic; using System.Configuration; using System.Data; using System.Linq; using System.Linq.Expressions; using System.Text; using BoYuan.Entity; using BoYuan.Framework.Log; using Newtonsoft.Json; using SqlSugar; using DbType = SqlSugar.DbType; //參考sqlsugar 官方文檔:http://www.codeisbug.com/Doc/8/ namespace BoYuan.DBServices { public class DB_Base { /// <summary> /// 獲取數據庫連接實體,禁止使用靜態變量對接 /// </summary> public static SqlSugarClient Instance { get { SqlSugarClient db = new SqlSugarClient(new ConnectionConfig() { ConnectionString = ConfigurationManager.AppSettings["ConnectionString"], DbType = DbType.SqlServer,//設置數據庫類型 IsAutoCloseConnection = true,//自動釋放數據務,如果存在事務,在事務結束后釋放 InitKeyType = InitKeyType.SystemTable,//從數據庫系統表讀取主鍵信息中(InitKeyType.Attribute從實體特性中讀取主鍵自增列信息) ConfigureExternalServices = new ConfigureExternalServices() { DataInfoCacheService = new HttpRuntimeCache() //設置緩存,繼承ICacheService自已實現的一個類 //DataInfoCacheService = new RedisCache() //RedisCache是繼承ICacheService自已實現的一個類 } }); //http://www.codeisbug.com/Doc/8/1140 調試SQL,AOP ,日志 db.Aop.OnLogExecuted = (sql, pars) => //SQL執行完事件 { #if DEBUG //獲取執行后的總毫秒數 double sqlExecutionTotalMilliseconds = db.Ado.SqlExecutionTime.TotalMilliseconds; #endif }; db.Aop.OnLogExecuting = (sql, pars) => //SQL執行前事件。可在這里查看生成的sql { #if DEBUG string tempSQL = LookSQL(sql, pars); #endif }; db.Aop.OnError = (exp) =>//執行SQL 錯誤事件 { //exp.sql exp.parameters 可以拿到參數和錯誤Sql StringBuilder sb_SugarParameterStr = new StringBuilder("###SugarParameter參數為:"); var parametres = exp.Parametres as SugarParameter[]; if (parametres != null) { sb_SugarParameterStr.Append(JsonConvert.SerializeObject(parametres)); } StringBuilder sb_error=new StringBuilder(); sb_error.AppendLine("SqlSugarClient執行sql異常信息:" + exp.Message) ; sb_error.AppendLine("###賦值后sql:" + LookSQL(exp.Sql, parametres)) ; sb_error.AppendLine("###帶參數的sql:" + exp.Sql) ; sb_error.AppendLine("###參數信息:" + sb_SugarParameterStr.ToString()); sb_error.AppendLine("###StackTrace信息:" + exp.StackTrace); Logger.Default.Error(sb_error.ToString()); }; db.Aop.OnExecutingChangeSql = (sql, pars) => //SQL執行前 可以修改SQL { //判斷update或delete方法是否有where條件。如果真的想刪除所有數據,請where(p=>true)或where(p=>p.id>0) if (sql.TrimStart().IndexOf("delete ", StringComparison.CurrentCultureIgnoreCase) == 0) { if (sql.IndexOf("where", StringComparison.CurrentCultureIgnoreCase) <= 0) { throw new Exception("delete刪除方法需要有where條件!!"); } } else if (sql.TrimStart().IndexOf("update ", StringComparison.CurrentCultureIgnoreCase) == 0) { if (sql.IndexOf("where", StringComparison.CurrentCultureIgnoreCase) <= 0) { throw new Exception("update更新方法需要有where條件!!"); } } return new KeyValuePair<string, SugarParameter[]>(sql, pars); }; //db.Aop.OnDiffLogEvent = it =>// 數據庫操作前和操作后的數據變化。 //{ // var editBeforeData = it.BeforeData; // var editAfterData = it.AfterData; // var sql = it.Sql; // var parameter = it.Parameters; // var data = it.BusinessData; // var time = it.Time; // var diffType = it.DiffType;//枚舉值 insert 、update 和 delete 用來作業務區分 // //你可以在這里面寫日志方法 //}; //db.Ado.CommandTimeOut //設置sql執行超時等待時間(毫秒單位) //db.Ado.Connection.ConnectionTimeout //設置數據庫連接等待時間(毫秒單位) return db; } } /// <summary> /// 查看賦值后的sql /// </summary> /// <param name="sql"></param> /// <param name="pars">參數</param> /// <returns></returns> private static string LookSQL(string sql, SugarParameter[] pars) { if (pars == null || pars.Length == 0) return sql; StringBuilder sb_sql = new StringBuilder(sql); var tempOrderPars = pars.Where(p=>p.Value!=null).OrderByDescending(p => p.ParameterName.Length).ToList();//防止 @par1錯誤替換@par12 for (var index = 0; index < tempOrderPars.Count; index++) { sb_sql.Replace(tempOrderPars[index].ParameterName, "'" + tempOrderPars[index].Value.ToString() + "'"); } return sb_sql.ToString(); } #region 獲取實體 /// <summary> /// 獲取一個實體 /// </summary> /// <typeparam name="T"></typeparam> /// <param name="id">主鍵</param> /// <returns></returns> public static T GetModel<T>(object id) { return GetModel<T>(id, DB_Base.Instance); } /// <summary> /// 獲取一個實體 /// </summary> /// <typeparam name="T"></typeparam> /// <param name="id">主鍵</param> /// <param name="db"></param> /// <returns></returns> public static T GetModel<T>(object id, SqlSugarClient db) { return db.Queryable<T>().InSingle(id); } #region 從緩存中獲取一個實體 /// <summary> /// 從緩存中獲取一個實體 /// </summary> /// <typeparam name="T"></typeparam> /// <param name="id">主鍵</param> /// <returns></returns> public static T GetModel_WithCache<T>(object id) { return GetModel_WithCache<T>(id, Instance); } /// <summary> /// 從緩存中獲取一個實體 /// </summary> /// <typeparam name="T"></typeparam> /// <param name="id">主鍵</param> /// <param name="db"></param> /// <returns></returns> public static T GetModel_WithCache<T>(object id, SqlSugarClient db) { return db.Queryable<T>().WithCache().InSingle(id); } #endregion #endregion #region 添加 /// <summary> /// 添加實體數據,並返回主鍵值(主鍵為自增int類型id,實體需要設置主鍵特性(為null字段不更新,注意model有默認值的情況) /// </summary> /// <typeparam name="T"></typeparam> /// <param name="t"></param> /// <returns></returns> public static int InsertModel<T>(T t) where T : class, new() { return InsertModel(t, DB_Base.Instance); } /// <summary> /// 添加實體數據,並返回主鍵值(主鍵為自增int類型id,實體需要設置主鍵特性)(為null字段不更新,注意model有默認值的情況) /// </summary> /// <typeparam name="T"></typeparam> /// <param name="t"></param> /// <param name="db">(事務的db對象)</param> /// <returns></returns> public static int InsertModel<T>(T t, SqlSugarClient db) where T : class, new() { //Where(true/*不插入null值的列*/,false/*不插入主鍵值*/) return db.Insertable(t). //IgnoreColumns(p=>p.Equals("id",StringComparison.InvariantCultureIgnoreCase)). IgnoreColumns(true, false).ExecuteReturnIdentity(); } /// <summary> /// 添加實體數據,並返回主鍵值(主鍵為自增long類型id,實體需要設置主鍵特性(為null字段不更新,注意model有默認值的情況) /// </summary> /// <typeparam name="T"></typeparam> /// <param name="t"></param> /// <returns></returns> public static long InsertModel_BigIdentity<T>(T t) where T : class, new() { return InsertModel_BigIdentity(t, DB_Base.Instance); } /// <summary> /// 添加實體數據,並返回主鍵值(主鍵為自增long類型id,實體需要設置主鍵特性)(為null字段不更新,注意model有默認值的情況) /// </summary> /// <typeparam name="T"></typeparam> /// <param name="t"></param> /// <param name="db">(事務的db對象)</param> /// <returns></returns> public static long InsertModel_BigIdentity<T>(T t, SqlSugarClient db) where T : class, new() { //Where(true/*不插入null值的列*/,false/*不插入主鍵值*/) return db.Insertable(t). //IgnoreColumns(p=>p.Equals("id",StringComparison.InvariantCultureIgnoreCase)). IgnoreColumns(true, false).ExecuteReturnBigIdentity(); } #region 刪除緩存 /// <summary> /// 添加實體數據,刪除緩存,並返回主鍵值(主鍵為自增int類型id,實體需要設置主鍵特性(為null字段不更新,注意model有默認值的情況) /// </summary> /// <typeparam name="T"></typeparam> /// <param name="t"></param> /// <returns></returns> public static int InsertModel_RemoveDataCache<T>(T t) where T : class, new() { return InsertModel_RemoveDataCache(t, DB_Base.Instance); } /// <summary> /// 添加實體數據,刪除緩存,並返回主鍵值(主鍵為自增int類型id,實體需要設置主鍵特性)(為null字段不更新,注意model有默認值的情況) /// </summary> /// <typeparam name="T"></typeparam> /// <param name="t"></param> /// <param name="db">(事務的db對象)</param> /// <returns></returns> public static int InsertModel_RemoveDataCache<T>(T t, SqlSugarClient db) where T : class, new() { //Where(true/*不插入null值的列*/,false/*不插入主鍵值*/) return db.Insertable(t). //IgnoreColumns(p=>p.Equals("id",StringComparison.InvariantCultureIgnoreCase)). IgnoreColumns(true, false).RemoveDataCache().ExecuteReturnIdentity(); } /// <summary> /// 添加實體數據,並返回主鍵值(主鍵為自增long類型id,實體需要設置主鍵特性(為null字段不更新,注意model有默認值的情況) /// </summary> /// <typeparam name="T"></typeparam> /// <param name="t"></param> /// <returns></returns> public static long InsertModel_BigIdentity_RemoveDataCache<T>(T t) where T : class, new() { return InsertModel_BigIdentity_RemoveDataCache(t, DB_Base.Instance); } /// <summary> /// 添加實體數據,並返回主鍵值(主鍵為自增long類型id,實體需要設置主鍵特性)(為null字段不更新,注意model有默認值的情況) /// </summary> /// <typeparam name="T"></typeparam> /// <param name="t"></param> /// <param name="db">(事務的db對象)</param> /// <returns></returns> public static long InsertModel_BigIdentity_RemoveDataCache<T>(T t, SqlSugarClient db) where T : class, new() { //Where(true/*不插入null值的列*/,false/*不插入主鍵值*/) return db.Insertable(t). //IgnoreColumns(p=>p.Equals("id",StringComparison.InvariantCultureIgnoreCase)). IgnoreColumns(true, false).RemoveDataCache().ExecuteReturnBigIdentity(); } #endregion #endregion #region 更新 /// <summary> /// 根據主鍵更新實體(為null字段不更新,注意model有默認值的情況),返回影響條數(實體字段要有主鍵特性) /// </summary> /// <typeparam name="T"></typeparam> /// <param name="t"></param> /// <returns></returns> public static int UpdateModelByKey<T>(T t) where T : class, new() { return UpdateModelByKey(t, DB_Base.Instance); } /// <summary> /// 根據主鍵更新實體,返回影響條數(實體字段要有主鍵特性) /// </summary> /// <typeparam name="T"></typeparam> /// <param name="t"></param> /// <param name="db">(事務的db對象)</param> /// <returns></returns> public static int UpdateModelByKey<T>(T t, SqlSugarClient db) where T : class, new() { //字段null,不進行更新 return db.Updateable(t).IgnoreColumns(ignoreAllNullColumns: true).ExecuteCommand(); } /// <summary> /// 根據條件表達式更新實體(為null字段不更新,注意model有默認值的情況),返回影響條數 /// </summary> /// <typeparam name="T"></typeparam> /// <param name="t"></param> /// <param name="expressionWhere">條件表達式</param> /// <returns></returns> public static int UpdateModelsIgnoreNull<T>(T t, Expression<Func<T, bool>> expressionWhere) where T : class, new() { return UpdateModelsIgnoreNull(t, expressionWhere, DB_Base.Instance); } /// <summary> /// 根據條件表達式更新實體(為null字段不更新,注意model有默認值的情況),返回影響條數 /// </summary> /// <typeparam name="T"></typeparam> /// <param name="t"></param> /// <param name="expressionWhere">條件表達式</param> /// <param name="db">(事務的db對象)</param> /// <returns></returns> public static int UpdateModelsIgnoreNull<T>(T t, Expression<Func<T, bool>> expressionWhere, SqlSugarClient db) where T : class, new() { return db.Updateable(t).IgnoreColumns(ignoreAllNullColumns: true).Where(expressionWhere).ExecuteCommand(); } /// <summary> /// 根據條件表達式更新實體(指定要更新的列),返回影響條數 /// </summary> /// <typeparam name="T"></typeparam> /// <param name="t"></param> /// <param name="columns"></param> /// <param name="expressionWhere"></param> /// <returns></returns> public static int UpdateModels<T>(T t, Expression<Func<T, object>> columns, Expression<Func<T, bool>> expressionWhere) where T : class, new() { return UpdateModels<T>(t, columns, expressionWhere, DB_Base.Instance); } /// <summary> /// 根據條件表達式更新實體(指定要更新的列),返回影響條數 /// </summary> /// <typeparam name="T"></typeparam> /// <param name="t"></param> /// <param name="columns"></param> /// <param name="expressionWhere">條件表達式</param> /// <param name="db">(事務的db對象)</param> /// <returns></returns> public static int UpdateModels<T>(T t, Expression<Func<T, object>> columns, Expression<Func<T, bool>> expressionWhere, SqlSugarClient db) where T : class, new() { return db.Updateable(t).UpdateColumns(columns).Where(expressionWhere).ExecuteCommand(); } /// <summary> /// 動態更新 /// </summary> /// <typeparam name="T"></typeparam> /// <param name="columns">寫入要更新的字段</param> /// <param name="expressionWhere">where條件表達式</param> /// <returns></returns> public static int Update<T>(Expression<Func<T,T>> columns, Expression<Func<T, bool>> expressionWhere) where T : class, new() { return Update<T>(columns, expressionWhere, DB_Base.Instance); /* 調用示例 Update<Entity.SysAdmin>(p => new Entity.SysAdmin { photo = photo, Password = newPwd } ,p => p.ID == sm.id && p.Password == oldPwd) > 0; */ } /// <summary> /// 動態更新 /// </summary> /// <typeparam name="T"></typeparam> /// <param name="columns">要更新的字段</param> /// <param name="expressionWhere">where條件表達式</param> /// <param name="db"></param> /// <returns></returns> public static int Update<T>(Expression<Func<T,T>> columns, Expression<Func<T, bool>> expressionWhere, SqlSugarClient db) where T : class, new() { return db.Updateable<T>().SetColumns(columns). //IgnoreColumns(ignoreAllNullColumns: true).//不能加此方法,會有“CommandText 屬性尚未初始化”異常 Where(expressionWhere).ExecuteCommand(); /* 調用示例 Update<Entity.SysAdmin>(p => new Entity.SysAdmin { photo = photo, Password = newPwd } ,p => p.ID == sm.id && p.Password == oldPwd ,db) > 0; */ } #region 刪除緩存 /// <summary> /// 根據主鍵更新實體(為null字段不更新,注意model有默認值的情況)並刪除緩存,返回影響條數(實體字段要有主鍵特性) /// </summary> /// <typeparam name="T"></typeparam> /// <param name="t"></param> /// <returns></returns> public static int UpdateModelByKey_RemoveDataCache<T>(T t) where T : class, new() { return UpdateModelByKey_RemoveDataCache(t, DB_Base.Instance); } /// <summary> /// 根據主鍵更新實體,返回影響條數(實體字段要有主鍵特性)並刪除緩存,返回影響條數(實體字段要有主鍵特性) /// </summary> /// <typeparam name="T"></typeparam> /// <param name="t"></param> /// <param name="db">(事務的db對象)</param> /// <returns></returns> public static int UpdateModelByKey_RemoveDataCache<T>(T t, SqlSugarClient db) where T : class, new() { //字段null,不進行更新 return db.Updateable(t).IgnoreColumns(ignoreAllNullColumns: true).RemoveDataCache().ExecuteCommand(); } /// <summary> /// 根據條件表達式更新實體(指定要更新的列)並刪除緩存,返回影響條數 /// </summary> /// <typeparam name="T"></typeparam> /// <param name="t"></param> /// <param name="columns"></param> /// <param name="expressionWhere"></param> /// <returns></returns> public static int UpdateModels_RemoveDataCache<T>(T t, Expression<Func<T, object>> columns, Expression<Func<T, bool>> expressionWhere) where T : class, new() { return UpdateModels_RemoveDataCache<T>(t, columns, expressionWhere, Instance); } /// <summary> /// 根據條件表達式更新實體(指定要更新的列)並刪除緩存,返回影響條數 /// </summary> /// <typeparam name="T"></typeparam> /// <param name="t"></param> /// <param name="columns"></param> /// <param name="expressionWhere">條件表達式</param> /// <param name="db">(事務的db對象)</param> /// <returns></returns> public static int UpdateModels_RemoveDataCache<T>(T t, Expression<Func<T, object>> columns, Expression<Func<T, bool>> expressionWhere, SqlSugarClient db) where T : class, new() { return db.Updateable(t).UpdateColumns(columns).Where(expressionWhere).RemoveDataCache().ExecuteCommand(); } /// <summary> /// 動態更新,並刪除緩存 /// </summary> /// <typeparam name="T"></typeparam> /// <param name="columns">寫入要更新的字段</param> /// <param name="expressionWhere">where條件表達式</param> /// <returns></returns> public static int Update_RemoveDataCache<T>(Expression<Func<T, T>> columns, Expression<Func<T, bool>> expressionWhere) where T : class, new() { return Update_RemoveDataCache<T>(columns, expressionWhere, DB_Base.Instance); /* 調用示例 Update<Entity.SysAdmin>(p => new Entity.SysAdmin { photo = photo, Password = newPwd } ,p => p.ID == sm.id && p.Password == oldPwd) > 0; */ } /// <summary> /// 動態更新,並刪除緩存 /// </summary> /// <typeparam name="T"></typeparam> /// <param name="columns">要更新的字段</param> /// <param name="expressionWhere">where條件表達式</param> /// <param name="db"></param> /// <returns></returns> public static int Update_RemoveDataCache<T>(Expression<Func<T, T>> columns, Expression<Func<T, bool>> expressionWhere, SqlSugarClient db) where T : class, new() { return db.Updateable<T>().SetColumns(columns). //IgnoreColumns(ignoreAllNullColumns: true).//不能加此方法,會有“CommandText 屬性尚未初始化”異常 Where(expressionWhere).RemoveDataCache().ExecuteCommand(); /* 調用示例 Update<Entity.SysAdmin>(p => new Entity.SysAdmin { photo = photo, Password = newPwd } ,p => p.ID == sm.id && p.Password == oldPwd ,db) > 0; */ } #endregion #endregion #region 刪除方法 /// <summary> /// 刪除ids集合條件的字符串(高效率寫法,注意防止注入攻擊) /// </summary> /// <param name="ids">ids為字符串 "1,2,3"或"1" 形式</param> /// <param name="key">主鍵字段</param> /// <returns></returns> public static bool DeleteByWhereSql_ids<T>(string ids, string key = "id") where T : class, new() { return DeleteByWhereSql_ids<T>(ids, DB_Base.Instance, key); } /// <summary> /// 刪除ids集合條件的字符串(高效率寫法,注意防止注入攻擊) /// </summary> /// <param name="ids">ids為字符串 "1,2,3"或"1" 形式</param> /// <param name="db">(事務的db對象)</param> /// <param name="key">主鍵字段</param> /// <returns></returns> public static bool DeleteByWhereSql_ids<T>(string ids, SqlSugarClient db, string key = "id") where T : class, new() { return db.Deleteable<T>().Where(string.Format(" {0} IN ({1})", key, ids)).ExecuteCommand() > 0; } /// <summary> /// 刪除ids集合條件的字符串 /// </summary> /// <param name="ids">ids為字符串 "1,2,3"或"1" 形式 </param> /// <returns></returns> public static bool DeleteByIds<T>(string ids) where T : class, new() { return DeleteByIds<T>(ids, DB_Base.Instance); } /// <summary> /// 刪除ids集合條件的字符串 /// </summary> /// <param name="ids">ids為字符串 "1,2,3"或"1" 形式 </param> /// <param name="db">(事務的db對象)</param> /// <returns></returns> public static bool DeleteByIds<T>(string ids, SqlSugarClient db) where T : class, new() { return db.Deleteable<T>(GetIntListByString(ids)).ExecuteCommand() > 0; } /// <summary> /// 刪除ids集合條件的字符串 /// </summary> /// <typeparam name="T"></typeparam> /// <param name="ids">ids為字符串 "1,2,3"或"1" 形式</param> /// <returns></returns> public static bool DeleteByInt64_Ids<T>(string ids) where T : class, new() { return DeleteByInt64_Ids<T>(ids, DB_Base.Instance); } /// <summary> /// 刪除ids集合條件的字符串 /// </summary> /// <typeparam name="T"></typeparam> /// <param name="ids">ids為字符串 "1,2,3"或"1" 形式</param> /// <param name="db">(事務的db對象)</param> /// <returns></returns> public static bool DeleteByInt64_Ids<T>(string ids, SqlSugarClient db) where T : class, new() { return db.Deleteable<T>(GetLongListByString(ids)).ExecuteCommand() > 0; } /// <summary> /// 根據條件表達式刪除,返回影響條數 /// </summary> /// <typeparam name="T"></typeparam> /// <param name="expression"></param> /// <returns></returns> public static int DeleteModels<T>(Expression<Func<T, bool>> expression) where T : class, new() { return DeleteModels<T>(expression, DB_Base.Instance); } /// <summary> /// 根據條件表達式刪除,返回影響條數 /// </summary> /// <typeparam name="T"></typeparam> /// <param name="expression">表達式</param> /// <param name="db">(事務的db對象)</param> /// <returns></returns> public static int DeleteModels<T>(Expression<Func<T, bool>> expression, SqlSugarClient db) where T : class, new() { return db.Deleteable<T>().Where(expression).ExecuteCommand(); } #region 刪除緩存 /// <summary> /// 刪除ids集合條件的字符串(高效率寫法,注意防止注入攻擊),並刪除緩存 /// </summary> /// <param name="ids">ids為字符串 "1,2,3"或"1" 形式</param> /// <param name="key">主鍵字段</param> /// <returns></returns> public static bool DeleteByWhereSql_ids_RemoveDataCache<T>(string ids, string key = "id") where T : class, new() { return DeleteByWhereSql_ids_RemoveDataCache<T>(ids, DB_Base.Instance, key); } /// <summary> /// 刪除ids集合條件的字符串(高效率寫法,注意防止注入攻擊),並刪除緩存 /// </summary> /// <param name="ids">ids為字符串 "1,2,3"或"1" 形式</param> /// <param name="db">(事務的db對象)</param> /// <param name="key">主鍵字段</param> /// <returns></returns> public static bool DeleteByWhereSql_ids_RemoveDataCache<T>(string ids, SqlSugarClient db, string key = "id") where T : class, new() { return db.Deleteable<T>().Where(string.Format(" {0} IN ({1})", key, ids)).RemoveDataCache().ExecuteCommand() > 0; } /// <summary> /// 刪除ids集合條件的字符串,並刪除緩存 /// </summary> /// <param name="ids">ids為字符串 "1,2,3"或"1" 形式 </param> /// <returns></returns> public static bool DeleteByIds_RemoveDataCache<T>(string ids) where T : class, new() { return DeleteByIds_RemoveDataCache<T>(ids, Instance); } /// <summary> /// 刪除ids集合條件的字符串,並刪除緩存 /// </summary> /// <param name="ids">ids為字符串 "1,2,3"或"1" 形式 </param> /// <param name="db">(事務的db對象)</param> /// <returns></returns> public static bool DeleteByIds_RemoveDataCache<T>(string ids, SqlSugarClient db) where T : class, new() { return db.Deleteable<T>(GetIntListByString(ids)).RemoveDataCache().ExecuteCommand() > 0; } /// <summary> /// 刪除ids集合條件的字符串,並刪除緩存 /// </summary> /// <typeparam name="T"></typeparam> /// <param name="ids">ids為字符串 "1,2,3"或"1" 形式</param> /// <returns></returns> public static bool DeleteByInt64_Ids_RemoveDataCache<T>(string ids) where T : class, new() { return DeleteByInt64_Ids_RemoveDataCache<T>(ids, Instance); } /// <summary> /// 刪除ids集合條件的字符串,並刪除緩存 /// </summary> /// <typeparam name="T"></typeparam> /// <param name="ids">ids為字符串 "1,2,3"或"1" 形式</param> /// <param name="db">(事務的db對象)</param> /// <returns></returns> public static bool DeleteByInt64_Ids_RemoveDataCache<T>(string ids, SqlSugarClient db) where T : class, new() { return db.Deleteable<T>(GetLongListByString(ids)).RemoveDataCache().ExecuteCommand() > 0; } #endregion #endregion #region ids轉集合 /// <summary> /// 將字符串轉成int數組(, 號分割) /// </summary> /// <param name="ids"></param> /// <returns></returns> public static int[] GetIntListByString(string ids) { if (string.IsNullOrWhiteSpace(ids)) return null; return Array.ConvertAll<string, int>(ids.Split(','), Int32.Parse); } /// <summary> /// 將字符串轉成long數組(, 號分割) /// </summary> /// <param name="ids"></param> /// <returns></returns> public static long[] GetLongListByString(string ids) { if (string.IsNullOrWhiteSpace(ids)) return null; return Array.ConvertAll<string, long>(ids.Split(','), Int64.Parse); } #endregion #region 擴展查詢,不建議使用 /// <summary> /// 簡單查詢數據 /// </summary> /// <param name="tableName">表名</param> /// <param name="columns">字段</param> /// <param name="dicWhere">條件</param> /// <returns></returns> public static DataTable GetDataTable(string tableName, string columns, Dictionary<string, object> dicWhere) { var db = DB_Base.Instance; string sql = string.Format("select {0} from {1} ", columns, tableName); List<SugarParameter> sqlParams = new List<SugarParameter>(); if (dicWhere != null) { string whereSql = dicFill_where(dicWhere, ref sqlParams); return db.Ado.GetDataTable(sql + " where 1=1 " + whereSql, sqlParams.ToArray()); } else { return db.Ado.GetDataTable(sql); } } /// <summary> /// 查詢數據 /// </summary> /// <param name="sqlStr">sql</param> /// <param name="dicWhere">條件</param> /// <param name="whereSql">where 條件,加and (注意sql注入攻擊)</param> /// <param name="parList">擴展參數</param> /// <returns></returns> public static DataTable GetDataTableBySql(string sqlStr, Dictionary<string, object> dicWhere, string whereSql = "", List<SugarParameter> parList = null) { var db = DB_Base.Instance; List<SugarParameter> sqlParams = new List<SugarParameter>(); string _whereSql = dicFill_where(dicWhere, ref sqlParams) + whereSql; if (parList != null && parList.Count > 0) { sqlParams.AddRange(parList); } if (sqlParams.Count > 0) { return db.Ado.GetDataTable(string.Format(sqlStr + " {0} ", " where 1=1 " + _whereSql), sqlParams.ToArray()); } else { return db.Ado.GetDataTable(string.IsNullOrEmpty(whereSql) ? sqlStr : sqlStr + whereSql); } } /// <summary> /// 分頁取數據 /// </summary> /// <param name="tableName">前台子查詢生成表名字</param> /// <param name="dicWhere">where條件字段集合</param> /// <param name="whereSql">where條件,加 and (注意sql注入)</param> /// <param name="orderbyColumn">排序字段</param> /// <param name="pageIndex">當前頁碼(從0開始)</param> /// <param name="pageSize">一頁顯示多少條記錄</param> /// <param name="recordCount">返回總記錄</param> /// <param name="cte">cte的sql</param> /// <returns></returns> public static DataTable GetDataPage(string tableName, Dictionary<string, object> dicWhere, string whereSql, string orderbyColumn, int pageIndex, int pageSize, out int recordCount, string cte = "") { var db = DB_Base.Instance; List<SugarParameter> par = new List<SugarParameter>(); StringBuilder where = new StringBuilder(); where.Append(" where 1=1 "); where.Append(dicFill_where(dicWhere, ref par) + whereSql); string tableSql = tableName.Contains("select ") ? string.Format(" ( " + tableName + " {0} ) pageTable ", where.ToString()) : string.Format(" ( select * from " + tableName + " {0} ) pageTable ", where.ToString()); string sql = string.Format(@"{5} select {0},row_number() over(order by {1}) rid into #tt from {2} Order By {1} select * from #tt where rid> {3} and rid<={4} ;select count(1) from #tt ;drop table #tt ", " * ", orderbyColumn, tableSql, pageSize * pageIndex, pageSize * (pageIndex + 1), cte); DataSet ds = par.Count > 0 ? db.Ado.GetDataSetAll(sql, par.ToArray()) : db.Ado.GetDataSetAll(sql); recordCount = Convert.ToInt32(ds.Tables[1].Rows[0][0].ToString()); return ds.Tables[0]; } /// <summary> /// 封裝where參數sql語句 /// </summary> /// <param name="dicWhere"></param> /// <param name="par"></param> /// <returns></returns> private static string dicFill_where(Dictionary<string, object> dicWhere, ref List<SugarParameter> par) { StringBuilder whereSql = new StringBuilder(); if (dicWhere != null && dicWhere.Count > 0) { string keyName; foreach (KeyValuePair<string, object> keyDic in dicWhere) { keyName = getParameterName(keyDic.Key); if (keyDic.Value.ToString().Contains("%") || keyDic.Value.ToString().Contains("_") || (keyDic.Value.ToString().Contains("[") && keyDic.Value.ToString().Contains("]")) ) //只要是含有 % _ [ ] 都是按照模糊查詢 { whereSql.AppendFormat(" and {0} like @{1} ", keyDic.Key, keyName); } else { whereSql.AppendFormat(" and {0} = @{1} ", keyDic.Key, keyName); } par.Add(new SugarParameter(string.Format("@{0}", keyName), keyDic.Value)); } } return whereSql.ToString(); } /// <summary> /// 把字段名稱 [dbo].[new].[title] ,取字段名title /// </summary> /// <param name="key">字段</param> /// <returns></returns> private static string getParameterName(string key) { var temp = key.Split('.'); StringBuilder sb = new StringBuilder(temp[temp.Length - 1]); sb.Replace("[", string.Empty).Replace("]", string.Empty); return sb.ToString(); } /// <summary> /// 動態添加數據 /// </summary> /// <param name="tableName">表名</param> /// <param name="dic">參數和對應值集合</param> /// <returns>新添加數據id</returns> public static int InsertDB(string tableName, Dictionary<string, object> dic) { StringBuilder columns = new StringBuilder(); StringBuilder columnParameters = new StringBuilder(); List<SugarParameter> sqlParams = new List<SugarParameter>(); if (dic.Count > 0) { foreach (KeyValuePair<string, object> keyDic in dic) { columns.AppendFormat(",{0}", keyDic.Key); columnParameters.AppendFormat(",@{0}", getParameterName(keyDic.Key)); sqlParams.Add(new SugarParameter(string.Format("@{0}", getParameterName(keyDic.Key)), keyDic.Value)); } } else { return 0; } string sql = string.Format("insert into {0}({1}) values ({2});select @@IDENTITY", tableName, columns.ToString().Substring(1), columnParameters.ToString().Substring(1)); return DB_Base.Instance.Ado.ExecuteCommand(sql, sqlParams.ToArray()); } /// <summary> /// 動態更新數據 /// </summary> /// <param name="tableName">表名</param> /// <param name="dic">參數和對應值集合</param> /// <param name="whereSql">where 條件(注意sql注入攻擊)</param> /// <returns>是否更新成功!</returns> public static bool UpdateDB(string tableName, Dictionary<string, object> dic, string whereSql) { StringBuilder columns = new StringBuilder(); List<SugarParameter> sqlParams = new List<SugarParameter>(); string keyName; if (dic != null && dic.Count > 0) { foreach (KeyValuePair<string, object> keyDic in dic) { keyName = getParameterName(keyDic.Key); columns.AppendFormat(",{0}=@{1}", keyDic.Key, keyName); sqlParams.Add(new SugarParameter(string.Format("@{0}", keyName), keyDic.Value)); } } else { return false; } string sql = string.Format("update {0} set {1} where {2}", tableName, columns.ToString().Substring(1), whereSql); return DB_Base.Instance.Ado.ExecuteCommand(sql, sqlParams) > 0; } /// <summary> /// 動態更新數據 /// </summary> /// <param name="tableName">表名</param> /// <param name="dic">參數和對應值集合</param> /// <param name="dicWhere">where條件參數和對應值集合</param> /// <returns>是否更新成功!</returns> public static bool UpdateDB(string tableName, Dictionary<string, object> dic, Dictionary<string, object> dicWhere) { StringBuilder columns = new StringBuilder(); StringBuilder wheresSql = new StringBuilder(); List<SugarParameter> sqlParams = new List<SugarParameter>(); string keyName; if (dic != null && dic.Count > 0) { foreach (KeyValuePair<string, object> keyDic in dic) { keyName = getParameterName(keyDic.Key); columns.AppendFormat(",{0}=@{1}", keyDic.Key, keyName); sqlParams.Add(new SugarParameter(string.Format("@{0}", keyName), keyDic.Value)); } } else { return false; } if (dicWhere != null && dicWhere.Count > 0) { foreach (KeyValuePair<string, object> keyDic in dicWhere) { keyName = getParameterName(keyDic.Key); wheresSql.AppendFormat(" and {0}=@{1}", keyDic.Key, keyName); sqlParams.Add(new SugarParameter(string.Format("@{0}", keyName), keyDic.Value)); } } else { return false; } string sql = string.Format("update {0} set {1} where 1=1 {2}", tableName, columns.ToString().Substring(1), wheresSql.ToString().Substring(1)); return DB_Base.Instance.Ado.ExecuteCommand(sql, sqlParams) > 0; } /// <summary> /// 查詢是否存在此記錄 /// </summary> /// <param name="tableName">表名</param> /// <param name="dicWhere">條件</param> /// <param name="whereSql">條件(加 and)</param> /// <returns></returns> public static bool Exists(string tableName, Dictionary<string, object> dicWhere, string whereSql = "") { string sql = string.Format("select count(1) from {0} where 1=1 ", tableName); List<SugarParameter> sqlParams = new List<SugarParameter>(); string whereSql2 = dicFill_where(dicWhere, ref sqlParams) + whereSql; return DB_Base.Instance.Ado.GetInt(sql + whereSql2, sqlParams) > 0; } #endregion } } #region 示例說明 #region 注意:二級緩存使用注意事項 //參考:http://www.codeisbug.com/Doc/8/1156 //var list=db.Queryable<Student, School>((s1, s2) => s1.Id == s2.Id) //.Select(s1 => s1).WithCache().ToList();//可以設置過期時間WithCache(60) //緩存的更新全靠 增刪改的方法 //注意:下面的代碼是,刪除表的數據並且刪除緩存 // db.Deleteable<Student>().Where(it => it.Id == 1).RemoveDataCache().ExecuteCommand(); //同理 Updateable和Insertable一樣用法 //DBServices.DB_Base.Instance.Insertable(mo).Where(true, false).RemoveDataCache().ExecuteReturnIdentity();//添加數據,並刪除緩存 //DBServices.DB_Base.Instance.Updateable(mo) //.UpdateColumns(p => new {p.MBOroleName, p.remark, p.state, p.DepartmentId}) //.Where(p => p.id == int.Parse(Request["id"])) //.RemoveDataCache().ExecuteCommand();//更新數據並刪除緩存 #endregion #region 不添加實體的 更新方法 /* //不添加實體的 更新 bool b= DBServices.DB_Base.Update<Entity.sysAdmin>( p => new Entity.sysAdmin() {Remark = "",RealName = ""}, p => p.ID == int.Parse(Request["id"]))>0; //動態條件 更新字段 var bb= db.Updateable<Entity.sysAdmin>() .SetColumns(p => new Entity.sysAdmin { photo = "", Password = "" }) //動態條件 .SetColumnsIF(Remark.Text.Length>0, p => new Entity.sysAdmin { Remark = Remark.Text }) .Where(p => p.ID == 1 && p.Password == "").ExecuteCommand() > 0; // 可以寫匿名對象,更新指定的字段。(注意字段不要寫錯) bool bbb= db.Updateable<Entity.sysAdmin>(new { photo = ""}) .Where(p => p.ID == 1 && p.Password == "").ExecuteCommand() > 0; */ #endregion #region 多表連接查詢 /* var employeeList = db.Queryable<Entity.PlanStatus, Entity.Leader, Entity.Employee, Entity.MBOrole>((s, l, e, m) => new object[] { JoinType.Left,s.MBOroleId==l.MBOroleId, JoinType.Left,e.id==l.EmployeeId, JoinType.Left,s.MBOroleId==m.id }) .Where((s, l, e, m) => ids.Contains(s.PlanId)) .Select((s, l, e, m) => new Models.StatusModel { PlanId = s.PlanId, MBOroleId = s.MBOroleId, MBOroleName = m.MBOroleName, employeeNum = e.employeeNum, employeeName = e.employeeName, Status = s.Status }).ToList(); */ #endregion #region 跨數據庫多表查詢 // 跨數據庫多表查詢 /* var sql = db.Queryable<Entity.WorkContent, Entity.Work>((c, w) => new object[] { JoinType.Left,c.PlanId==w.PlanID }) .AS<Entity.WorkContent>("[bb].[dbo].[WorkContent]") .AS<Entity.Work>("[aa].[dbo].[Work]") .Select((c, w) => c) .ToSql(); */ // 如果單表連自己。可以復制 Entity.Work為Entity.Work2,這樣區分。 /* var sql = db.Queryable<Entity.Work2, Entity.Work>((c, w) => new object[] { JoinType.Left,c.PlanId==w.PlanID }) .AS<Entity.Work2>("[bb].[dbo].[Work]") .AS<Entity.Work>("[aa].[dbo].[Work]") .Select((c, w) => c) .ToSql(); */ #endregion #region 調用事務的例子 /* // 參考 http://www.codeisbug.com/Doc/8/1135 var db = DBServices.DB_Base.Instance; try { db.Ado.BeginTran(); //刪除 db.Deleteable<Entity.PlanContent>(ids).ExecuteCommand(); //更新 db.Updateable(modifiedDict).AS(tableName).WhereColumns(nameof(Entity.PlanContent.id)).ExecuteCommand(); //添加 db.Insertable(dicList).AS(tableName).ExecuteCommand(); //提交事務 db.Ado.CommitTran(); } catch (Exception ex) { //有異常 則回滾 db.Ado.RollbackTran(); } */ #endregion #endregion
