Update custom data type

This commit is contained in:
sunkaixuan
2023-03-04 16:26:47 +08:00
parent 5d969e5368
commit d019b96f7e
7 changed files with 70 additions and 25 deletions

View File

@@ -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<string> invalidTypes, string bindProperyTypeName, string validPropertyType, string propertyName)
{

View File

@@ -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);

View File

@@ -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);

View File

@@ -7,24 +7,24 @@ using System.Threading.Tasks;
namespace SqlSugar.DbConvert
{
public static class EnumToStringConvert
public class EnumToStringConvert: ISugarDataConverter
{
public static SugarParameter ParameterConverter<T>(object value, int i)
public SugarParameter ParameterConverter<T>(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<T>(this IDataRecord dr, int i)
public T QueryConverter<T>(IDataRecord dr, int i)
{
var str = dr.GetString(i);

View File

@@ -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);
}

View File

@@ -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<T>(object columnValue, int columnIndex);
T QueryConverter<T>(IDataRecord dataRecord, int dataRecordIndex);
}
}

View File

@@ -159,6 +159,7 @@
<Compile Include="ExpressionsToSql\Subquery\Items\SubWithNoLock.cs" />
<Compile Include="ExpressionsToSql\Subquery\Items\SubEnableTableFilter.cs" />
<Compile Include="Interface\ICustomConditionalFunc.cs" />
<Compile Include="Interface\ISugarDataConverter.cs" />
<Compile Include="Json2Sql\Entities\JsonDeleteResult.cs" />
<Compile Include="Json2Sql\Entities\JsonInsertResult.cs" />
<Compile Include="Json2Sql\Entities\JsonQueryResult.cs" />