From d019b96f7e0105c652c2bd40b4baa531ea87243f Mon Sep 17 00:00:00 2001 From: sunkaixuan <610262374@qq.com> Date: Sat, 4 Mar 2023 16:26:47 +0800 Subject: [PATCH] Update custom data type --- .../IDataReaderEntityBuilder.cs | 54 ++++++++++++++----- .../SqlBuilderProvider/InsertBuilder.cs | 4 +- .../SqlBuilderProvider/UpdateBuilder.cs | 4 +- .../SqlSugar/Entities/DefaultCustom.cs | 12 ++--- .../ResolveItems/ConstantExpressionResolve.cs | 4 +- .../SqlSugar/Interface/ISugarDataConverter.cs | 16 ++++++ Src/Asp.Net/SqlSugar/SqlSugar.csproj | 1 + 7 files changed, 70 insertions(+), 25 deletions(-) create mode 100644 Src/Asp.Net/SqlSugar/Interface/ISugarDataConverter.cs diff --git a/Src/Asp.Net/SqlSugar/Abstract/DbBindProvider/IDataReaderEntityBuilder.cs b/Src/Asp.Net/SqlSugar/Abstract/DbBindProvider/IDataReaderEntityBuilder.cs index 55fae090d..655cc5f18 100644 --- a/Src/Asp.Net/SqlSugar/Abstract/DbBindProvider/IDataReaderEntityBuilder.cs +++ b/Src/Asp.Net/SqlSugar/Abstract/DbBindProvider/IDataReaderEntityBuilder.cs @@ -155,8 +155,43 @@ namespace SqlSugar #endregion #region Private methods + private void BindCustomFunc(ILGenerator generator, LocalBuilder result, EntityColumnInfo columnInfo, string fieldName) + { + int i = DataRecord.GetOrdinal(fieldName); + Label endIfLabel = generator.DefineLabel(); + generator.Emit(OpCodes.Ldarg_0); + generator.Emit(OpCodes.Ldc_I4, i); + generator.Emit(OpCodes.Callvirt, isDBNullMethod); + generator.Emit(OpCodes.Brtrue, endIfLabel); + generator.Emit(OpCodes.Ldloc, result); + //generator.Emit(OpCodes.Ldarg_0); + //generator.Emit(OpCodes.Ldc_I4, i); + var method = (columnInfo.SqlParameterDbType as Type).GetMethod("QueryConverter"); + method = method.MakeGenericMethod(new Type[] { columnInfo.PropertyInfo.PropertyType }); + Type type = (columnInfo.SqlParameterDbType as Type); + //ConstructorInfo info = type.GetConstructor(Type.EmptyTypes); + //il.Emit(OpCodes.Newobj, info); + generator.Emit(OpCodes.Ldtoken, type); + generator.Emit(OpCodes.Ldarg_0); + generator.Emit(OpCodes.Ldc_I4, i); + method = (columnInfo.SqlParameterDbType as Type).GetMethod("QueryConverter"); + method = method.MakeGenericMethod(new Type[] { columnInfo.PropertyInfo.PropertyType }); + if (method.IsVirtual) + generator.Emit(OpCodes.Callvirt, method); + else + generator.Emit(OpCodes.Call, method); + generator.Emit(OpCodes.Callvirt, columnInfo.PropertyInfo.GetSetMethod(true)); + generator.MarkLabel(endIfLabel); + } private void BindClass(ILGenerator generator, LocalBuilder result, EntityColumnInfo columnInfo, string fieldName) { + + if (columnInfo.SqlParameterDbType is Type) + { + BindCustomFunc(generator, result, columnInfo, fieldName); + return; + } + if (columnInfo.IsJson) { MethodInfo jsonMethod = getJson.MakeGenericMethod(columnInfo.PropertyInfo.PropertyType); @@ -189,7 +224,7 @@ namespace SqlSugar generator.Emit(OpCodes.Callvirt, columnInfo.PropertyInfo.GetSetMethod(true)); generator.MarkLabel(endIfLabel); } - else if (columnInfo.UnderType == typeof(XElement)||columnInfo.SqlParameterDbType is Type) + else if (columnInfo.UnderType == typeof(XElement)) { int i = DataRecord.GetOrdinal(fieldName); Label endIfLabel = generator.DefineLabel(); @@ -207,6 +242,11 @@ namespace SqlSugar } private void BindField(ILGenerator generator, LocalBuilder result, EntityColumnInfo columnInfo, string fieldName) { + if (columnInfo.SqlParameterDbType is Type) + { + BindCustomFunc(generator,result, columnInfo, fieldName); + return; + } int i = DataRecord.GetOrdinal(fieldName); Label endIfLabel = generator.DefineLabel(); generator.Emit(OpCodes.Ldarg_0); @@ -271,7 +311,6 @@ namespace SqlSugar { method = isNullableType ? getOtherNull.MakeGenericMethod(bindPropertyType) : getOther.MakeGenericMethod(bindPropertyType); } - method = GetMethodConvert(columnInfo, method); if (method.IsVirtual) generator.Emit(OpCodes.Callvirt, method); else @@ -403,7 +442,6 @@ namespace SqlSugar if (method == null) method = isNullableType ? getOtherNull.MakeGenericMethod(bindPropertyType) : getOther.MakeGenericMethod(bindPropertyType); - method = GetMethodConvert(columnInfo, method); if (method.IsVirtual) generator.Emit(OpCodes.Callvirt, method); @@ -412,16 +450,6 @@ namespace SqlSugar #endregion } - private static MethodInfo GetMethodConvert(EntityColumnInfo columnInfo, MethodInfo method) - { - if (columnInfo.SqlParameterDbType is Type) - { - method = (columnInfo.SqlParameterDbType as Type).GetMethod("QueryConverter"); - method=method.MakeGenericMethod(new Type[] { columnInfo.PropertyInfo.PropertyType }); - } - - return method; - } private void CheckType(List invalidTypes, string bindProperyTypeName, string validPropertyType, string propertyName) { diff --git a/Src/Asp.Net/SqlSugar/Abstract/SqlBuilderProvider/InsertBuilder.cs b/Src/Asp.Net/SqlSugar/Abstract/SqlBuilderProvider/InsertBuilder.cs index aaceaa301..407523a42 100644 --- a/Src/Asp.Net/SqlSugar/Abstract/SqlBuilderProvider/InsertBuilder.cs +++ b/Src/Asp.Net/SqlSugar/Abstract/SqlBuilderProvider/InsertBuilder.cs @@ -288,8 +288,8 @@ namespace SqlSugar { var type=columnInfo.SqlParameterDbType as Type; var ParameterConverter=type.GetMethod("ParameterConverter").MakeGenericMethod(columnInfo.PropertyType); - //var obj=Activator.CreateInstance(type); - var p = ParameterConverter.Invoke(null,new object[] {columnInfo.Value, GetDbColumnIndex }) as SugarParameter; + var obj=Activator.CreateInstance(type); + var p = ParameterConverter.Invoke(obj,new object[] {columnInfo.Value, GetDbColumnIndex }) as SugarParameter; GetDbColumnIndex++; //this.Parameters.RemoveAll(it => it.ParameterName == it.ParameterName); this.Parameters.Add(p); diff --git a/Src/Asp.Net/SqlSugar/Abstract/SqlBuilderProvider/UpdateBuilder.cs b/Src/Asp.Net/SqlSugar/Abstract/SqlBuilderProvider/UpdateBuilder.cs index ce7331c96..8c2dedb32 100644 --- a/Src/Asp.Net/SqlSugar/Abstract/SqlBuilderProvider/UpdateBuilder.cs +++ b/Src/Asp.Net/SqlSugar/Abstract/SqlBuilderProvider/UpdateBuilder.cs @@ -405,8 +405,8 @@ namespace SqlSugar { var type = columnInfo.SqlParameterDbType as Type; var ParameterConverter = type.GetMethod("ParameterConverter").MakeGenericMethod(columnInfo.PropertyType); - //var obj = Activator.CreateInstance(type); - var p = ParameterConverter.Invoke(null,new object[] { columnInfo.Value, GetDbColumnIndex }) as SugarParameter; + var obj = Activator.CreateInstance(type); + var p = ParameterConverter.Invoke(obj,new object[] { columnInfo.Value, GetDbColumnIndex }) as SugarParameter; GetDbColumnIndex++; //this.Parameters.RemoveAll(it => it.ParameterName == it.ParameterName); this.Parameters.Add(p); diff --git a/Src/Asp.Net/SqlSugar/Entities/DefaultCustom.cs b/Src/Asp.Net/SqlSugar/Entities/DefaultCustom.cs index 2510de28b..f5c130371 100644 --- a/Src/Asp.Net/SqlSugar/Entities/DefaultCustom.cs +++ b/Src/Asp.Net/SqlSugar/Entities/DefaultCustom.cs @@ -7,24 +7,24 @@ using System.Threading.Tasks; namespace SqlSugar.DbConvert { - public static class EnumToStringConvert + public class EnumToStringConvert: ISugarDataConverter { - public static SugarParameter ParameterConverter(object value, int i) + public SugarParameter ParameterConverter(object columnValue, int columnIndex) { - var name = "@myenmu" + i; + var name = "@MyEnmu" + columnIndex; Type undertype = SqlSugar.UtilMethods.GetUnderType(typeof(T));//获取没有nullable的枚举类型 - if (value == null) + if (columnValue == null) { return new SugarParameter(name, null); } else { - var enumObjString = Enum.Parse(undertype, value + "").ToString(); + var enumObjString = Enum.Parse(undertype, columnValue + "").ToString(); return new SugarParameter(name, enumObjString); } } - public static T QueryConverter(this IDataRecord dr, int i) + public T QueryConverter(IDataRecord dr, int i) { var str = dr.GetString(i); diff --git a/Src/Asp.Net/SqlSugar/ExpressionsToSql/ResolveItems/ConstantExpressionResolve.cs b/Src/Asp.Net/SqlSugar/ExpressionsToSql/ResolveItems/ConstantExpressionResolve.cs index ca589c682..9a7d16a07 100644 --- a/Src/Asp.Net/SqlSugar/ExpressionsToSql/ResolveItems/ConstantExpressionResolve.cs +++ b/Src/Asp.Net/SqlSugar/ExpressionsToSql/ResolveItems/ConstantExpressionResolve.cs @@ -54,8 +54,8 @@ namespace SqlSugar { var type = columnInfo.SqlParameterDbType as Type; var ParameterConverter = type.GetMethod("ParameterConverter").MakeGenericMethod(columnInfo.PropertyInfo.PropertyType); - //var obj=Activator.CreateInstance(type); - var p = ParameterConverter.Invoke(null, new object[] { expression.Value, 100 }) as SugarParameter; + var obj=Activator.CreateInstance(type); + var p = ParameterConverter.Invoke(obj, new object[] { expression.Value, 100 }) as SugarParameter; customParameter = base.AppendParameter(p); } diff --git a/Src/Asp.Net/SqlSugar/Interface/ISugarDataConverter.cs b/Src/Asp.Net/SqlSugar/Interface/ISugarDataConverter.cs new file mode 100644 index 000000000..207427f8e --- /dev/null +++ b/Src/Asp.Net/SqlSugar/Interface/ISugarDataConverter.cs @@ -0,0 +1,16 @@ +using System; +using System.Collections.Generic; +using System.Data; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace SqlSugar +{ + public interface ISugarDataConverter + { + SugarParameter ParameterConverter(object columnValue, int columnIndex); + + T QueryConverter(IDataRecord dataRecord, int dataRecordIndex); + } +} diff --git a/Src/Asp.Net/SqlSugar/SqlSugar.csproj b/Src/Asp.Net/SqlSugar/SqlSugar.csproj index ed3905991..d26d3d545 100644 --- a/Src/Asp.Net/SqlSugar/SqlSugar.csproj +++ b/Src/Asp.Net/SqlSugar/SqlSugar.csproj @@ -159,6 +159,7 @@ +