From 056f21597f1418ef80cfa0101aae09a86009bcf8 Mon Sep 17 00:00:00 2001 From: sunkaixuan <610262374@qq.com> Date: Fri, 21 Jun 2024 19:14:33 +0800 Subject: [PATCH] Synchronization code --- .../UpdateProvider/ParameterUpdateable.cs | 73 +++++++++++++++++++ .../UpdateProvider/UpdateableHelper.cs | 34 +++++++++ 2 files changed, 107 insertions(+) diff --git a/Src/Asp.Net/SqlSugar/Abstract/UpdateProvider/ParameterUpdateable.cs b/Src/Asp.Net/SqlSugar/Abstract/UpdateProvider/ParameterUpdateable.cs index 82e4b3a4b..966e88c0b 100644 --- a/Src/Asp.Net/SqlSugar/Abstract/UpdateProvider/ParameterUpdateable.cs +++ b/Src/Asp.Net/SqlSugar/Abstract/UpdateProvider/ParameterUpdateable.cs @@ -1,7 +1,9 @@ using System; using System.Collections.Generic; +using System.Data; using System.Linq; using System.Text; +using System.Text.RegularExpressions; using System.Threading.Tasks; namespace SqlSugar @@ -18,9 +20,11 @@ namespace SqlSugar var size = GetPageSize(20, count); Context.Utilities.PageEach(list.ToList(), size, item => { + Before(item.ToList()); List allParamter = new List(); var sql=GetSql(item); result+=Context.Ado.ExecuteCommand(sql.Key, sql.Value); + After(item.ToList()); }); return result<0?count:result; } @@ -32,13 +36,82 @@ namespace SqlSugar var size = GetPageSize(20, count); await Context.Utilities.PageEachAsync(list.ToList(), size,async item => { + Before(item.ToList()); List allParamter = new List(); var sql = GetSql(item); result +=await Context.Ado.ExecuteCommandAsync(sql.Key, sql.Value); + After(item.ToList()); }); return result < 0 ? count : result; } + + private void Before(List updateObjects) + { + if (this.Updateable.IsEnableDiffLogEvent && updateObjects.Count > 0) + { + var isDisableMasterSlaveSeparation = this.Updateable.Ado.IsDisableMasterSlaveSeparation; + this.Updateable.Ado.IsDisableMasterSlaveSeparation = true; + var parameters = Updateable.UpdateBuilder.Parameters; + if (parameters == null) + parameters = new List(); + Updateable.diffModel.BeforeData = GetDiffTable(updateObjects); + Updateable.diffModel.Sql = this.Updateable.UpdateBuilder.ToSqlString(); + Updateable.diffModel.Parameters = parameters.ToArray(); + this.Updateable.Ado.IsDisableMasterSlaveSeparation = isDisableMasterSlaveSeparation; + } + } + + protected void After(List updateObjects) + { + if (this.Updateable.IsEnableDiffLogEvent && updateObjects.Count > 0) + { + var isDisableMasterSlaveSeparation = this.Updateable.Ado.IsDisableMasterSlaveSeparation; + this.Updateable.Ado.IsDisableMasterSlaveSeparation = true; + Updateable.diffModel.AfterData = GetDiffTable(updateObjects); + Updateable.diffModel.Time = this.Context.Ado.SqlExecutionTime; + if (this.Context.CurrentConnectionConfig.AopEvents.OnDiffLogEvent != null) + this.Context.CurrentConnectionConfig.AopEvents.OnDiffLogEvent(Updateable.diffModel); + this.Updateable.Ado.IsDisableMasterSlaveSeparation = isDisableMasterSlaveSeparation; + } + if (this.Updateable.RemoveCacheFunc != null) + { + this.Updateable.RemoveCacheFunc(); + } + } + private List GetDiffTable(List updateObjects) + { + var builder = Updateable.UpdateBuilder.Builder; + var tableWithString = builder.GetTranslationColumnName(Updateable.UpdateBuilder.TableName); + var wheres = Updateable.WhereColumnList ?? Updateable.UpdateBuilder.PrimaryKeys; + if (wheres == null) + { + wheres = Updateable.UpdateBuilder.DbColumnInfoList + .Where(it => it.IsPrimarykey).Select(it => it.DbColumnName).Distinct().ToList(); + } + var sqlDb = this.Context.CopyNew(); + sqlDb.Aop.DataExecuting = null; + var dataColumns = sqlDb.Updateable(updateObjects).UpdateBuilder.DbColumnInfoList; + List parameters = new List(); + StringBuilder allWhereString = new StringBuilder(); + string columnStr = string.Join(",", dataColumns.Select(x => x.DbColumnName).Distinct().ToList()); + foreach (var item in dataColumns.GroupBy(it => it.TableId)) + { + StringBuilder whereString = new StringBuilder(); + foreach (var whereItem in wheres) + { + var pk = item.FirstOrDefault(it => it.DbColumnName.EqualCase(whereItem)); + var paraterName = FormatValue(pk.PropertyType, pk.DbColumnName, pk.Value, parameters); + whereString.Append($" {pk.DbColumnName} = {paraterName} AND"); + } + allWhereString.Append($" {Regex.Replace(whereString.ToString(), "AND$", "")} OR"); + } + string key = $"SELECT {columnStr} FROM {tableWithString} WHERE {Regex.Replace(allWhereString.ToString(), "OR$", "")}"; + + var dt = sqlDb.Ado.GetDataTable(key, parameters); + return Updateable.GetTableDiff(dt); + } + #region Values Helper public KeyValuePair GetSql(List updateObjects) diff --git a/Src/Asp.Net/SqlSugar/Abstract/UpdateProvider/UpdateableHelper.cs b/Src/Asp.Net/SqlSugar/Abstract/UpdateProvider/UpdateableHelper.cs index a5f9fcfd3..1473ab679 100644 --- a/Src/Asp.Net/SqlSugar/Abstract/UpdateProvider/UpdateableHelper.cs +++ b/Src/Asp.Net/SqlSugar/Abstract/UpdateProvider/UpdateableHelper.cs @@ -757,6 +757,40 @@ namespace SqlSugar return result; } + internal List GetTableDiff(DataTable dt) + { + List result = new List(); + 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) + { + try + { + var sugarColumn = this.EntityInfo.Columns.Where(it => it.DbColumnName != null).First(it => + it.DbColumnName.Equals(col.ColumnName, StringComparison.CurrentCultureIgnoreCase)); + DiffLogColumnInfo addItem = new DiffLogColumnInfo(); + addItem.Value = row[col.ColumnName]; + addItem.ColumnName = col.ColumnName; + addItem.IsPrimaryKey = sugarColumn.IsPrimarykey; + addItem.ColumnDescription = sugarColumn.ColumnDescription; + item.Columns.Add(addItem); + } + catch (Exception ex) + { + Check.ExceptionEasy(col.ColumnName + " No corresponding entity attribute found in difference log ." + ex.Message, col.ColumnName + "在差异日志中可能没有找到相应的实体属性,详细:" + ex.Message); + } + } + result.Add(item); + } + } + return result; + } private List GetDiffTable(string sql, List parameters) { List result = new List();