mirror of
https://gitee.com/dotnetchina/SqlSugar.git
synced 2026-02-26 13:43:10 +08:00
Update custom data type
This commit is contained in:
@@ -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)
|
||||
{
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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);
|
||||
|
||||
}
|
||||
|
||||
16
Src/Asp.Net/SqlSugar/Interface/ISugarDataConverter.cs
Normal file
16
Src/Asp.Net/SqlSugar/Interface/ISugarDataConverter.cs
Normal 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);
|
||||
}
|
||||
}
|
||||
@@ -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" />
|
||||
|
||||
Reference in New Issue
Block a user