diff --git a/Src/Asp.Net/SqlServerTest/Demos/9_Aop.cs b/Src/Asp.Net/SqlServerTest/Demos/9_Aop.cs index 816ee82f9..3b439874f 100644 --- a/Src/Asp.Net/SqlServerTest/Demos/9_Aop.cs +++ b/Src/Asp.Net/SqlServerTest/Demos/9_Aop.cs @@ -14,7 +14,7 @@ namespace OrmTest.Demo { SqlSugarClient db = new SqlSugarClient(new ConnectionConfig() { ConnectionString = Config.ConnectionString, DbType = DbType.SqlServer, IsAutoCloseConnection = true }); - + db.Aop.OnLogExecuted = (sql, pars) => { Console.Write("time:" + db.Ado.SqlExecutionTime.ToString()); @@ -57,7 +57,11 @@ namespace OrmTest.Demo }; - var id = db.Insertable(new Student() { Name="beforeName" }).ExecuteReturnIdentity(); + var id = db.Insertable(new Student() { Name = "beforeName" }) + .EnableDiffLogEvent(new { title="add student"}) + .ExecuteReturnIdentity(); + + db.Updateable(new Student() { Id = id, @@ -65,11 +69,14 @@ namespace OrmTest.Demo Name = "afterName", SchoolId = 2 }) - .EnableDiffLogEvent(new { title= "update Student", Modular=1, Operator="admin" }) + .EnableDiffLogEvent(new { title = "update Student", Modular = 1, Operator = "admin" }) + .ExecuteCommand(); + + + db.Deleteable(id) + .EnableDiffLogEvent(new { title = "delete student" }) .ExecuteCommand(); - db.Deleteable(id).EnableDiffLogEvent(new { title = "delete student" }).ExecuteCommand(); - } } diff --git a/Src/Asp.Net/SqlSugar/Abstract/InsertableProvider/InsertableProvider.cs b/Src/Asp.Net/SqlSugar/Abstract/InsertableProvider/InsertableProvider.cs index 0d5543097..b73cc4bc8 100644 --- a/Src/Asp.Net/SqlSugar/Abstract/InsertableProvider/InsertableProvider.cs +++ b/Src/Asp.Net/SqlSugar/Abstract/InsertableProvider/InsertableProvider.cs @@ -1,5 +1,6 @@ using System; using System.Collections.Generic; +using System.Data; using System.Linq; using System.Linq.Expressions; using System.Text; @@ -26,6 +27,9 @@ namespace SqlSugar public MappingTableList OldMappingTableList { get; set; } public bool IsAs { get; set; } + public bool IsEnableDiffLogEvent { get; set; } + public DiffLogModel diffModel { get; set; } + #region Core public virtual int ExecuteCommand() @@ -35,7 +39,10 @@ namespace SqlSugar AutoRemoveDataCache(); string sql = InsertBuilder.ToSqlString(); RestoreMapping(); - return Ado.ExecuteCommand(sql, InsertBuilder.Parameters == null ? null : InsertBuilder.Parameters.ToArray()); + Before(sql); + var result= Ado.ExecuteCommand(sql, InsertBuilder.Parameters == null ? null : InsertBuilder.Parameters.ToArray()); + After(sql,null); + return result; } public virtual KeyValuePair> ToSql() @@ -54,7 +61,10 @@ namespace SqlSugar AutoRemoveDataCache(); string sql = InsertBuilder.ToSqlString(); RestoreMapping(); - return Ado.GetInt(sql, InsertBuilder.Parameters == null ? null : InsertBuilder.Parameters.ToArray()); + Before(sql); + var result= Ado.GetInt(sql, InsertBuilder.Parameters == null ? null : InsertBuilder.Parameters.ToArray()); + After(sql,result); + return result; } public virtual long ExecuteReturnBigIdentity() { @@ -63,7 +73,10 @@ namespace SqlSugar AutoRemoveDataCache(); string sql = InsertBuilder.ToSqlString(); RestoreMapping(); - return Convert.ToInt64( Ado.GetScalar(sql, InsertBuilder.Parameters == null ? null : InsertBuilder.Parameters.ToArray())); + Before(sql); + var result= Convert.ToInt64( Ado.GetScalar(sql, InsertBuilder.Parameters == null ? null : InsertBuilder.Parameters.ToArray())); + After(sql,result); + return result; } public virtual T ExecuteReturnEntity() { @@ -199,6 +212,15 @@ namespace SqlSugar CacheSchemeMain.RemoveCache(cacheService, this.Context.EntityMaintenance.GetTableName()); return this; } + public IInsertable EnableDiffLogEvent(object businessData = null) + { + + diffModel = new DiffLogModel(); + this.IsEnableDiffLogEvent = true; + diffModel.BusinessData = businessData; + diffModel.DiffType = DiffType.insert; + return this; + } #endregion #region Protected Methods @@ -395,6 +417,76 @@ namespace SqlSugar asyncInsertableBuilder.TableWithString = this.InsertBuilder.TableWithString; return asyncInsertable; } + + private void After(string sql,long? result) + { + if (this.IsEnableDiffLogEvent) + { + var parameters = InsertBuilder.Parameters; + if (parameters == null) + parameters = new List(); + diffModel.AfterDate = GetDiffTable(sql,result); + diffModel.Time = this.Context.Ado.SqlExecutionTime; + if (this.Context.Ado.DiffLogEvent != null) + this.Context.Ado.DiffLogEvent(diffModel); + } + } + private void Before(string sql) + { + if (this.IsEnableDiffLogEvent) + { + var parameters = InsertBuilder.Parameters; + if (parameters == null) + parameters = new List(); + diffModel.BeforeData = null; + diffModel.Sql = sql; + diffModel.Parameters = parameters.ToArray(); + } + } + private List GetDiffTable(string sql,long? identity) + { + List parameters = new List(); + List result = new List(); + var whereSql = string.Empty; + List cons = new List(); + if (identity != null) + { + var fieldName = EntityInfo.Columns.Last(it => it.IsIdentity).DbColumnName; + cons.Add(new ConditionalModel() { ConditionalType=ConditionalType.Equal, FieldName= fieldName, FieldValue=identity.ToString() }); + } + else { + foreach(var item in this.EntityInfo.Columns.Where(it => it.IsIgnore == false&&it.IsPrimarykey==true)) { + var fielddName = item.DbColumnName; + var fieldValue = this.EntityInfo.Columns.FirstOrDefault(it => it.PropertyName == item.PropertyName).PropertyInfo.GetValue(this.InsertObjs.Last(), null).ObjToString(); + cons.Add(new ConditionalModel() { ConditionalType = ConditionalType.Equal, FieldName = fielddName, FieldValue =fieldValue }); + } + } + Check.Exception(cons.IsNullOrEmpty(), "Insertable.EnableDiffLogEvent need primary key"); + var sqlable = this.Context.Utilities.ConditionalModelToSql(cons); + whereSql = sqlable.Key; + parameters.AddRange(sqlable.Value); + var dt = this.Context.Queryable().Where(whereSql).AddParameters(parameters).ToDataTable(); + if (dt.Rows != null && dt.Rows.Count > 0) + { + foreach (DataRow row in dt.Rows) + { + DiffLogTableInfo item = new DiffLogTableInfo(); + item.TableDescription = this.EntityInfo.TableDescription; + item.TableName = this.EntityInfo.DbTableName; + item.Columns = new List(); + foreach (DataColumn col in dt.Columns) + { + DiffLogColumnInfo addItem = new DiffLogColumnInfo(); + addItem.Value = row[col.ColumnName]; + addItem.ColumnName = col.ColumnName; + addItem.ColumnDescription = this.EntityInfo.Columns.First(it => it.DbColumnName.Equals(col.ColumnName, StringComparison.CurrentCultureIgnoreCase)).ColumnDescription; + item.Columns.Add(addItem); + } + result.Add(item); + } + } + return result; + } #endregion } } diff --git a/Src/Asp.Net/SqlSugar/Interface/Insertable.cs b/Src/Asp.Net/SqlSugar/Interface/Insertable.cs index 8e9e67149..654ee5f8d 100644 --- a/Src/Asp.Net/SqlSugar/Interface/Insertable.cs +++ b/Src/Asp.Net/SqlSugar/Interface/Insertable.cs @@ -27,6 +27,7 @@ namespace SqlSugar IInsertable IgnoreColumns(Expression> columns); IInsertable IgnoreColumns(Func ignoreColumMethod); IInsertable Where(bool isInsertNull, bool isOffIdentity = false); + IInsertable EnableDiffLogEvent(object businessData = null); IInsertable RemoveDataCache(); KeyValuePair> ToSql(); }