New file |
| | |
| | | using Newtonsoft.Json; |
| | | using SqlSugar; |
| | | using System; |
| | | using System.Collections.Generic; |
| | | using System.Configuration; |
| | | using System.Linq; |
| | | using System.Linq.Expressions; |
| | | |
| | | namespace HH.WCS.Mobox3.FJJT.util |
| | | { |
| | | //https://www.donet5.com/Home/Doc |
| | | public class SqlHelper<T> where T : class, new() |
| | | { |
| | | public bool ExecuteSql(string sql) { |
| | | try { |
| | | var code = GetInstance().Ado.ExecuteCommand(sql); |
| | | return code > 1; |
| | | } |
| | | catch (Exception ex) { |
| | | return false; |
| | | } |
| | | } |
| | | |
| | | public bool Update(T model, string[] cols) { |
| | | var db = GetInstance(); |
| | | return db.Updateable<T>(model).UpdateColumns(cols).ExecuteCommand() > 0; |
| | | } |
| | | public List<T> GetList(Expression<Func<T, bool>> where = null) { |
| | | var db = GetInstance(); |
| | | if (where == null) { |
| | | return db.Queryable<T>().ToList(); |
| | | } |
| | | else { |
| | | return db.Queryable<T>().Where(where).ToList(); |
| | | } |
| | | } |
| | | public T Get(Expression<Func<T, bool>> where, Expression<Func<T, object>> order, bool asc = false) { |
| | | SqlSugarClient db = GetInstance(); |
| | | if (order == null) { |
| | | return db.Queryable<T>().Where(where).Single(); |
| | | } |
| | | else { |
| | | return db.Queryable<T>().Where(where).OrderBy(order, asc ? OrderByType.Asc : OrderByType.Desc).First(); |
| | | } |
| | | } |
| | | public T Get(Expression<Func<T, bool>> where, Expression<Func<T, object>> orderBy = null) { |
| | | try { |
| | | var db = GetInstance(); |
| | | T model = null; |
| | | if (orderBy != null) { |
| | | model = db.Queryable<T>().Where(where).OrderBy(orderBy, OrderByType.Desc).First();//查询表的所有 |
| | | } |
| | | else { |
| | | model = db.Queryable<T>().Where(where).First(); |
| | | } |
| | | return model; |
| | | } |
| | | catch (Exception ex) { |
| | | Console.WriteLine(ex.Message); |
| | | return default(T); |
| | | } |
| | | } |
| | | public bool Update(T model) { |
| | | var db = GetInstance(); |
| | | return db.Updateable<T>(model).ExecuteCommand() > 0; |
| | | } |
| | | public bool Insert(T model) { |
| | | try { |
| | | var db = GetInstance(); |
| | | return db.Insertable<T>(model).ExecuteCommand() > 0; |
| | | } |
| | | catch (Exception ex) { |
| | | return false; |
| | | } |
| | | } |
| | | |
| | | //删除指定条件数据 |
| | | public bool Deleteable(Expression<Func<T, bool>> where) { |
| | | try { |
| | | var db = GetInstance(); |
| | | return db.Deleteable<T>().Where(where).ExecuteCommand() > 0; |
| | | } |
| | | catch (Exception ex) { |
| | | return false; |
| | | } |
| | | } |
| | | |
| | | |
| | | //创建SqlSugarClient |
| | | public SqlSugarClient GetInstance(string url = "") { |
| | | //创建数据库对象 |
| | | SqlSugarClient db = new SqlSugarClient(new ConnectionConfig() { |
| | | ConnectionString = string.IsNullOrEmpty(url) ? Settings.OracleServer : url, |
| | | //ConnectionString = @"Data Source=192.168.1.198\sql2008;Initial Catalog=OIMobox;User ID=sa;Password=sa@2015", |
| | | /* DbType = DbType.SqlServer,*/ |
| | | //ConnectionString = @"localhost/OIMobox;User ID=system;Password=Am123123", |
| | | //ConnectionString = @"Data Source=(DESCRIPTION=(ADDRESS_LIST=(ADDRESS=(PROTOCOL=TCP)(HOST=localhost)(PORT=1521)))(CONNECT_DATA=(SERVER=DEDICATED)(SERVICE_NAME=OIMobox)));User Id=system;Password=Am123123;", |
| | | DbType = DbType.Oracle, |
| | | IsAutoCloseConnection = true, |
| | | InitKeyType = InitKeyType.Attribute//从特性读取主键自增信息 |
| | | }); |
| | | // |
| | | //db.MappingTables.Add("",""); |
| | | |
| | | //监控所有超过1秒的Sql |
| | | db.Aop.OnLogExecuted = (sql, p) => { |
| | | //执行时间超过1秒 |
| | | if (db.Ado.SqlExecutionTime.TotalSeconds > 1) { |
| | | Console.WriteLine(sql + "\r\n" + db.Utilities.SerializeObject(p.ToDictionary(it => it.ParameterName, it => it.Value))); |
| | | //代码CS文件名 |
| | | var fileName = db.Ado.SqlStackTrace.FirstFileName; |
| | | //代码行数 |
| | | var fileLine = db.Ado.SqlStackTrace.FirstLine; |
| | | //方法名 |
| | | var FirstMethodName = db.Ado.SqlStackTrace.FirstMethodName; |
| | | //db.Ado.SqlStackTrace.MyStackTraceList[1].xxx 获取上层方法的信息 |
| | | } |
| | | //相当于EF的 PrintToMiniProfiler |
| | | }; |
| | | db.Aop.DataExecuted = (value, entity) => { |
| | | entity.EntityColumnInfos.ToList().ForEach(a => { |
| | | var pvalue = entity.GetValue(a.PropertyName); |
| | | if (pvalue != null && pvalue.GetType() == typeof(String)) { |
| | | entity.SetValue(a.PropertyName, pvalue.ToString().Trim()); |
| | | } |
| | | }); |
| | | }; |
| | | |
| | | /* db.Aop.OnLogExecuting = (sql, pars) => |
| | | { |
| | | Console.WriteLine(sql); |
| | | foreach (var param in pars) |
| | | { |
| | | Console.WriteLine($"{param.ParameterName}: {param.Value}"); |
| | | } |
| | | };*/ |
| | | //据转换 (ExecuteCommand才会拦截,查询不行) |
| | | //db.Aop.DataExecuting = (value, entity) => { |
| | | // //var val=entity.EntityColumnInfo |
| | | // Console.WriteLine(entity.EntityName); |
| | | //}; |
| | | |
| | | db.Aop.OnExecutingChangeSql = (sql, pars) => //可以修改SQL和参数的值 |
| | | { |
| | | if (pars != null && db.CurrentConnectionConfig.DbType == DbType.Oracle && pars.Any()) |
| | | { |
| | | var input = sql; |
| | | Stack<int> stack = new Stack<int>(); |
| | | List<string> results = new List<string>(); |
| | | for (int i = 0; i < input.Length; i++) |
| | | { |
| | | if (input[i] == '(') |
| | | { |
| | | stack.Push(i); |
| | | } |
| | | else if (input[i] == ')') |
| | | { |
| | | if (stack.Count > 0) |
| | | { |
| | | int start = stack.Pop(); |
| | | string content = input.Substring(start + 1, i - start - 1); |
| | | results.Add(content); |
| | | } |
| | | } |
| | | } |
| | | foreach (var p in pars) |
| | | { |
| | | if (p.DbType == System.Data.DbType.String) |
| | | { |
| | | var result = results.Find(x => x.Contains(p.ParameterName) && x.Count(c => c == '=') == 1); |
| | | if (result != null && !result.Contains("trim(")) |
| | | { |
| | | string[] parts = result.Split('='); |
| | | if (parts.Length > 1) |
| | | { |
| | | string Field = parts[0]; |
| | | sql = sql.Replace(result, $"trim({Field}) = {p.ParameterName}"); |
| | | } |
| | | } |
| | | } |
| | | } |
| | | } |
| | | return new KeyValuePair<string, SugarParameter[]>(sql, pars); |
| | | }; |
| | | return db; |
| | | } |
| | | |
| | | |
| | | public SqlSugarClient GetOracleInstance(string url = "") |
| | | { |
| | | //创建数据库对象 |
| | | SqlSugarClient db = new SqlSugarClient(new ConnectionConfig() |
| | | { |
| | | //ConnectionString = string.IsNullOrEmpty(url) ? Settings.SqlServer : url, |
| | | //ConnectionString = @"Data Source=192.168.1.198\sql2008;Initial Catalog=OIMobox;User ID=sa;Password=sa@2015", |
| | | //DbType = DbType.SqlServer, |
| | | //ConnectionString = @"Data Source=(DESCRIPTION=(ADDRESS_LIST=(ADDRESS=(PROTOCOL=TCP)(HOST=localhost)(PORT=1521)))(CONNECT_DATA=(SERVER=DEDICATED)(SERVICE_NAME=OIMobox)));User Id=system;Password=Am123123;", |
| | | /* ConnectionString = "Data Source=(DESCRIPTION=(ADDRESS_LIST=(ADDRESS=(PROTOCOL=TCP)(HOST=10.3.18.224)(PORT=1521)))(CONNECT_DATA=(SERVER=DEDICATED)(SERVICE_NAME=db1.hec.prod)));User Id=WMS_X5;Password=WMS_X5_2617;",*/ |
| | | ConnectionString = @url, |
| | | DbType = DbType.Oracle, |
| | | IsAutoCloseConnection = true, |
| | | InitKeyType = InitKeyType.Attribute//从特性读取主键自增信息 |
| | | }); |
| | | // |
| | | //db.MappingTables.Add("",""); |
| | | |
| | | //监控所有超过1秒的Sql |
| | | db.Aop.OnLogExecuted = (sql, p) => { |
| | | //执行时间超过1秒 |
| | | if (db.Ado.SqlExecutionTime.TotalSeconds > 1) |
| | | { |
| | | Console.WriteLine(sql + "\r\n" + db.Utilities.SerializeObject(p.ToDictionary(it => it.ParameterName, it => it.Value))); |
| | | //代码CS文件名 |
| | | var fileName = db.Ado.SqlStackTrace.FirstFileName; |
| | | //代码行数 |
| | | var fileLine = db.Ado.SqlStackTrace.FirstLine; |
| | | //方法名 |
| | | var FirstMethodName = db.Ado.SqlStackTrace.FirstMethodName; |
| | | //db.Ado.SqlStackTrace.MyStackTraceList[1].xxx 获取上层方法的信息 |
| | | } |
| | | //相当于EF的 PrintToMiniProfiler |
| | | }; |
| | | |
| | | db.Aop.DataExecuted = (value, entity) => { |
| | | entity.EntityColumnInfos.ToList().ForEach(a => { |
| | | var pvalue = entity.GetValue(a.PropertyName); |
| | | if (pvalue != null && pvalue.GetType() == typeof(String)) |
| | | { |
| | | entity.SetValue(a.PropertyName, pvalue.ToString().Trim()); |
| | | } |
| | | }); |
| | | }; |
| | | |
| | | //据转换 (ExecuteCommand才会拦截,查询不行) |
| | | //db.Aop.DataExecuting = (value, entity) => { |
| | | // //var val=entity.EntityColumnInfo |
| | | // Console.WriteLine(entity.EntityName); |
| | | //}; |
| | | db.Aop.OnExecutingChangeSql = (sql, pars) => //可以修改SQL和参数的值 |
| | | { |
| | | if (pars.Any()) |
| | | { |
| | | int index = sql.IndexOf("WHERE") + 6; |
| | | var input = string.Join("", sql.Skip(index)); |
| | | // 使用栈来匹配成对的括号 |
| | | Stack<int> stack = new Stack<int>(); |
| | | List<string> results = new List<string>(); |
| | | for (int i = 0; i < input.Length; i++) |
| | | { |
| | | if (input[i] == '(') |
| | | { |
| | | stack.Push(i); |
| | | } |
| | | else if (input[i] == ')') |
| | | { |
| | | if (stack.Count > 0) |
| | | { |
| | | int start = stack.Pop(); |
| | | string content = input.Substring(start + 1, i - start - 1); |
| | | results.Add(content); |
| | | } |
| | | } |
| | | } |
| | | foreach (var p in pars) |
| | | { |
| | | if (p.DbType == System.Data.DbType.String) |
| | | { |
| | | Console.WriteLine(p.ParameterName); |
| | | var result = results.Find(x => x.Contains(p.ParameterName) && x.Count(c => c == '=') == 1); |
| | | if (result != null && !result.Contains("trim(")) |
| | | { |
| | | string[] parts = result.Split('"'); |
| | | if (parts.Length > 1) |
| | | { |
| | | string Field = parts[1]; |
| | | sql = sql.Replace(result, $"trim(\"{Field}\") = {p.ParameterName}"); |
| | | } |
| | | } |
| | | } |
| | | } |
| | | } |
| | | return new KeyValuePair<string, SugarParameter[]>(sql, pars); |
| | | }; |
| | | return db; |
| | | } |
| | | } |
| | | |
| | | } |