From 85b2789fbd0228bcfaa5c04de7591f58d989f702 Mon Sep 17 00:00:00 2001 From: sunkaixuan <610262374@qq.com> Date: Sat, 20 Jan 2024 20:43:31 +0800 Subject: [PATCH] Synchronization code --- .../SqlBuilderProvider/UpdateBuilder.cs | 28 ++++++++++++++++++- .../UpdateProvider/UpdateableHelper.cs | 2 +- Src/Asp.Net/SqlSugar/Utilities/UtilMethods.cs | 8 ++++++ 3 files changed, 36 insertions(+), 2 deletions(-) diff --git a/Src/Asp.Net/SqlSugar/Abstract/SqlBuilderProvider/UpdateBuilder.cs b/Src/Asp.Net/SqlSugar/Abstract/SqlBuilderProvider/UpdateBuilder.cs index 53a8148f1..c60c4ea8f 100644 --- a/Src/Asp.Net/SqlSugar/Abstract/SqlBuilderProvider/UpdateBuilder.cs +++ b/Src/Asp.Net/SqlSugar/Abstract/SqlBuilderProvider/UpdateBuilder.cs @@ -40,6 +40,7 @@ namespace SqlSugar public string ShortName { get; set; } public Dictionary ReSetValueBySqlExpList { get; set; } public virtual string ReSetValueBySqlExpListType { get; set; } + public EntityInfo EntityInfo { get; set; } public virtual string SqlTemplate { get @@ -287,11 +288,25 @@ namespace SqlSugar { if (IsWhereColumns == false) { + int i = 100000; foreach (var item in PrimaryKeys) { + i++; var isFirst = whereString == null; whereString += (isFirst ? " WHERE " : " AND "); - whereString += Builder.GetTranslationColumnName(item) + "=" + this.Context.Ado.SqlParameterKeyWord + item; + var pkIsSugarDataConverter = GetPkIsSugarDataConverter(); + if (pkIsSugarDataConverter && GetColumnInfo(item)!=null) + { + var columnInfo = GetColumnInfo(item); + var value=this.DbColumnInfoList.FirstOrDefault(it => it.DbColumnName.EqualCase(item) || it.PropertyName.EqualCase(item))?.Value; + var p = UtilMethods.GetParameterConverter(i, this.Context, value, this.EntityInfo, this.EntityInfo?.Columns.First(it => it.DbColumnName.Equals(item) || it.PropertyName.Equals(item))); + whereString += Builder.GetTranslationColumnName(item) + "=" + p.ParameterName; + this.Parameters.Add(p); + } + else + { + whereString += Builder.GetTranslationColumnName(item) + "=" + this.Context.Ado.SqlParameterKeyWord + item; + } } } } @@ -311,6 +326,17 @@ namespace SqlSugar return string.Format(SqlTemplate, GetTableNameString, columnsString, whereString); } + private EntityColumnInfo GetColumnInfo(string item) + { + var columnInfo= this.EntityInfo?.Columns?.FirstOrDefault(it => it.DbColumnName.Equals(item) || it.PropertyName.Equals(item)); + return columnInfo; + } + + private bool GetPkIsSugarDataConverter() + { + return this.EntityInfo?.Columns.Any(it => it.IsPrimarykey && it.SqlParameterDbType is Type&&typeof(ISugarDataConverter).IsAssignableFrom((it.SqlParameterDbType as Type))) == true; + } + protected virtual string GetJoinUpdate(string columnsString, ref string whereString) { var tableName = Builder.GetTranslationColumnName(this.TableName); diff --git a/Src/Asp.Net/SqlSugar/Abstract/UpdateProvider/UpdateableHelper.cs b/Src/Asp.Net/SqlSugar/Abstract/UpdateProvider/UpdateableHelper.cs index 85826f479..0fd0815f7 100644 --- a/Src/Asp.Net/SqlSugar/Abstract/UpdateProvider/UpdateableHelper.cs +++ b/Src/Asp.Net/SqlSugar/Abstract/UpdateProvider/UpdateableHelper.cs @@ -379,7 +379,7 @@ namespace SqlSugar || columns.Contains(it.PropertyName, StringComparer.OrdinalIgnoreCase) || columns.Contains(it.DbColumnName, StringComparer.OrdinalIgnoreCase)).ToList(); } - + UpdateBuilder.EntityInfo = this.EntityInfo; UpdateBuilder.PrimaryKeys = GetPrimaryKeys(); if (this.IsWhereColumns) { diff --git a/Src/Asp.Net/SqlSugar/Utilities/UtilMethods.cs b/Src/Asp.Net/SqlSugar/Utilities/UtilMethods.cs index 3e6c79ae9..42f972933 100644 --- a/Src/Asp.Net/SqlSugar/Utilities/UtilMethods.cs +++ b/Src/Asp.Net/SqlSugar/Utilities/UtilMethods.cs @@ -76,6 +76,14 @@ namespace SqlSugar var p = ParameterConverter.Invoke(obj, new object[] { value, 100+index }) as SugarParameter; return p; } + internal static SugarParameter GetParameterConverter(int index, ISqlSugarClient db, object value,EntityInfo entity, EntityColumnInfo columnInfo) + { + var type = columnInfo.SqlParameterDbType as Type; + var ParameterConverter = type.GetMethod("ParameterConverter").MakeGenericMethod(columnInfo.PropertyInfo.PropertyType); + var obj = Activator.CreateInstance(type); + var p = ParameterConverter.Invoke(obj, new object[] { value, 100 + index }) as SugarParameter; + return p; + } internal static bool IsErrorParameterName(ConnectionConfig connectionConfig,DbColumnInfo columnInfo) { return connectionConfig.MoreSettings?.IsCorrectErrorSqlParameterName == true &&