mirror of
https://gitee.com/dotnetchina/SqlSugar.git
synced 2026-02-27 06:03:09 +08:00
Synchronization code
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);
|
||||
@@ -203,10 +238,15 @@ namespace SqlSugar
|
||||
BindMethod(generator, columnInfo, i);
|
||||
generator.Emit(OpCodes.Callvirt, columnInfo.PropertyInfo.GetSetMethod(true));
|
||||
generator.MarkLabel(endIfLabel);
|
||||
}
|
||||
}
|
||||
}
|
||||
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);
|
||||
@@ -259,7 +299,7 @@ namespace SqlSugar
|
||||
{
|
||||
method = isNullableType ? getOtherNull.MakeGenericMethod(bindPropertyType) : getOther.MakeGenericMethod(bindPropertyType);
|
||||
}
|
||||
else if (dbTypeName.EqualCase("STRING"))
|
||||
else if (dbTypeName.EqualCase("STRING"))
|
||||
{
|
||||
method = isNullableType ? getOtherNull.MakeGenericMethod(bindPropertyType) : getOther.MakeGenericMethod(bindPropertyType);
|
||||
}
|
||||
@@ -271,7 +311,6 @@ namespace SqlSugar
|
||||
{
|
||||
method = isNullableType ? getOtherNull.MakeGenericMethod(bindPropertyType) : getOther.MakeGenericMethod(bindPropertyType);
|
||||
}
|
||||
|
||||
if (method.IsVirtual)
|
||||
generator.Emit(OpCodes.Callvirt, method);
|
||||
else
|
||||
@@ -403,6 +442,7 @@ namespace SqlSugar
|
||||
if (method == null)
|
||||
method = isNullableType ? getOtherNull.MakeGenericMethod(bindPropertyType) : getOther.MakeGenericMethod(bindPropertyType);
|
||||
|
||||
|
||||
if (method.IsVirtual)
|
||||
generator.Emit(OpCodes.Callvirt, method);
|
||||
else
|
||||
@@ -410,6 +450,7 @@ namespace SqlSugar
|
||||
#endregion
|
||||
}
|
||||
|
||||
|
||||
private void CheckType(List<string> invalidTypes, string bindProperyTypeName, string validPropertyType, string propertyName)
|
||||
{
|
||||
var isAny = invalidTypes.Contains(bindProperyTypeName);
|
||||
|
||||
@@ -112,6 +112,10 @@ namespace SqlSugar
|
||||
{
|
||||
continue;
|
||||
}
|
||||
if (item.SqlParameterDbType is Type)
|
||||
{
|
||||
continue;
|
||||
}
|
||||
if (item.IsJson)
|
||||
{
|
||||
paramters.IsJson = true;
|
||||
@@ -217,7 +221,8 @@ namespace SqlSugar
|
||||
TableId = i,
|
||||
InsertSql = column.InsertSql,
|
||||
InsertServerTime = column.InsertServerTime,
|
||||
DataType=column.DataType
|
||||
DataType=column.DataType,
|
||||
SqlParameterDbType= column.SqlParameterDbType
|
||||
|
||||
};
|
||||
if (column.DbColumnName == null)
|
||||
|
||||
@@ -57,8 +57,12 @@ namespace SqlSugar
|
||||
this.Context.AddQueue("end \r\n");
|
||||
result +=this.Context.SaveQueues(false);
|
||||
});
|
||||
if (this.Context.CurrentConnectionConfig.DbType == DbType.Oracle)
|
||||
result=objects.Length;
|
||||
//if (this.Context.CurrentConnectionConfig.DbType == DbType.Oracle)
|
||||
// result=objects.Length;
|
||||
if (result == -1)
|
||||
{
|
||||
result = objects.Length;
|
||||
}
|
||||
return result;
|
||||
}
|
||||
public async Task<int> DefaultExecuteCommandAsync()
|
||||
|
||||
@@ -284,6 +284,17 @@ namespace SqlSugar
|
||||
{
|
||||
return columnInfo.InsertSql;
|
||||
}
|
||||
else if (columnInfo.SqlParameterDbType is Type)
|
||||
{
|
||||
var type=columnInfo.SqlParameterDbType as Type;
|
||||
var ParameterConverter=type.GetMethod("ParameterConverter").MakeGenericMethod(columnInfo.PropertyType);
|
||||
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);
|
||||
return p.ParameterName;
|
||||
}
|
||||
else if (columnInfo.DataType?.Equals("nvarchar2")==true)
|
||||
{
|
||||
var pname = Builder.SqlParameterKeyWord + columnInfo.DbColumnName + "_ts" + GetDbColumnIndex;
|
||||
@@ -293,7 +304,7 @@ namespace SqlSugar
|
||||
GetDbColumnIndex++;
|
||||
return pname;
|
||||
}
|
||||
else if (columnInfo.PropertyType.Name == "TimeOnly" && name != null && !name.ObjToString().StartsWith(Builder.SqlParameterKeyWord))
|
||||
else if (columnInfo.PropertyType!=null&&columnInfo.PropertyType.Name == "TimeOnly" && name != null && !name.ObjToString().StartsWith(Builder.SqlParameterKeyWord))
|
||||
{
|
||||
var timeSpan = UtilMethods.TimeOnlyToTimeSpan(columnInfo.Value);
|
||||
var pname = Builder.SqlParameterKeyWord + columnInfo.DbColumnName + "_ts" + GetDbColumnIndex;
|
||||
|
||||
@@ -401,7 +401,18 @@ namespace SqlSugar
|
||||
{
|
||||
return columnInfo.UpdateSql;
|
||||
}
|
||||
else if (columnInfo.PropertyType.Name == "TimeOnly" && name != null && !name.ObjToString().StartsWith(Builder.SqlParameterKeyWord))
|
||||
else if (columnInfo.SqlParameterDbType is Type)
|
||||
{
|
||||
var type = columnInfo.SqlParameterDbType as Type;
|
||||
var ParameterConverter = type.GetMethod("ParameterConverter").MakeGenericMethod(columnInfo.PropertyType);
|
||||
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);
|
||||
return p.ParameterName;
|
||||
}
|
||||
else if (columnInfo.PropertyType!=null&&columnInfo.PropertyType.Name == "TimeOnly" && name != null && !name.ObjToString().StartsWith(Builder.SqlParameterKeyWord))
|
||||
{
|
||||
var timeSpan = UtilMethods.TimeOnlyToTimeSpan(columnInfo.Value);
|
||||
var pname = Builder.SqlParameterKeyWord + columnInfo.DbColumnName + "_ts" + GetDbColumnIndex;
|
||||
@@ -414,20 +425,20 @@ namespace SqlSugar
|
||||
return name + "";
|
||||
}
|
||||
}
|
||||
public virtual string GetDbColumn(DbColumnInfo columnInfo, string name)
|
||||
{
|
||||
if (columnInfo.UpdateServerTime)
|
||||
{
|
||||
return LambdaExpressions.DbMehtods.GetDate();
|
||||
}
|
||||
else if (columnInfo.UpdateSql.HasValue())
|
||||
{
|
||||
return columnInfo.UpdateSql;
|
||||
}
|
||||
else
|
||||
{
|
||||
return name + "";
|
||||
}
|
||||
}
|
||||
//public virtual string GetDbColumn(DbColumnInfo columnInfo, string name)
|
||||
//{
|
||||
// if (columnInfo.UpdateServerTime)
|
||||
// {
|
||||
// return LambdaExpressions.DbMehtods.GetDate();
|
||||
// }
|
||||
// else if (columnInfo.UpdateSql.HasValue())
|
||||
// {
|
||||
// return columnInfo.UpdateSql;
|
||||
// }
|
||||
// else
|
||||
// {
|
||||
// return name + "";
|
||||
// }
|
||||
//}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -278,6 +278,10 @@ namespace SqlSugar
|
||||
{
|
||||
continue;
|
||||
}
|
||||
if (item.SqlParameterDbType is Type)
|
||||
{
|
||||
continue;
|
||||
}
|
||||
var parameter = new SugarParameter(this.SqlBuilder.SqlParameterKeyWord + item.DbColumnName, item.Value, item.PropertyType);
|
||||
if (item.IsJson)
|
||||
{
|
||||
|
||||
35
Src/Asp.NetCore2/SqlSugar/Entities/DefaultCustom.cs
Normal file
35
Src/Asp.NetCore2/SqlSugar/Entities/DefaultCustom.cs
Normal file
@@ -0,0 +1,35 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Data;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
namespace SqlSugar.DbConvert
|
||||
{
|
||||
public class EnumToStringConvert: ISugarDataConverter
|
||||
{
|
||||
public SugarParameter ParameterConverter<T>(object columnValue, int columnIndex)
|
||||
{
|
||||
var name = "@MyEnmu" + columnIndex;
|
||||
Type undertype = SqlSugar.UtilMethods.GetUnderType(typeof(T));//获取没有nullable的枚举类型
|
||||
if (columnValue == null)
|
||||
{
|
||||
return new SugarParameter(name, null);
|
||||
}
|
||||
else
|
||||
{
|
||||
var enumObjString = Enum.Parse(undertype, columnValue + "").ToString();
|
||||
return new SugarParameter(name, enumObjString);
|
||||
}
|
||||
}
|
||||
|
||||
public T QueryConverter<T>(IDataRecord dr, int i)
|
||||
{
|
||||
|
||||
var str = dr.GetString(i);
|
||||
Type undertype = SqlSugar.UtilMethods.GetUnderType(typeof(T));//获取没有nullable的枚举类型
|
||||
return (T)Enum.Parse(undertype, str);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -216,6 +216,13 @@ namespace SqlSugar
|
||||
this.Context.Parameters.Add(new SugarParameter(parameterName, paramterValue));
|
||||
return parameterName;
|
||||
}
|
||||
protected string AppendParameter(SugarParameter p)
|
||||
{
|
||||
p.ParameterName= p.ParameterName + this.Context.ParameterIndex;
|
||||
this.Context.ParameterIndex++; ;
|
||||
this.Context.Parameters.Add(p);
|
||||
return p.ParameterName;
|
||||
}
|
||||
protected void AppendNot(object Value)
|
||||
{
|
||||
var isAppend = !this.Context.Result.Contains(ExpressionConst.FormatSymbol);
|
||||
|
||||
@@ -131,6 +131,11 @@ namespace SqlSugar
|
||||
base.ExactExpression = expression;
|
||||
var leftExpression = expression.Left;
|
||||
var rightExpression = expression.Right;
|
||||
if (operatorValue == "="&& ExpressionTool.RemoveConvert(leftExpression) is ConstantExpression)
|
||||
{
|
||||
leftExpression = expression.Right;
|
||||
rightExpression = expression.Left;
|
||||
}
|
||||
if (RightIsHasValue(leftExpression, rightExpression,ExpressionTool.IsLogicOperator(expression)))
|
||||
{
|
||||
Expression trueValue = Expression.Constant(true);
|
||||
|
||||
@@ -11,6 +11,62 @@ namespace SqlSugar
|
||||
public ConstantExpressionResolve(ExpressionParameter parameter) : base(parameter)
|
||||
{
|
||||
var expression = base.Expression as ConstantExpression;
|
||||
string customParameter = GetCustomParameter(parameter, expression);
|
||||
if (customParameter == null)
|
||||
{
|
||||
DefaultConstant(parameter, expression);
|
||||
}
|
||||
else
|
||||
{
|
||||
CustomConstant(parameter, customParameter);
|
||||
}
|
||||
}
|
||||
|
||||
private void CustomConstant(ExpressionParameter parameter, string customParameter)
|
||||
{
|
||||
var baseParameter = parameter.BaseParameter;
|
||||
var isSetTempData = baseParameter.CommonTempData.HasValue() && baseParameter.CommonTempData.Equals(CommonTempDataType.Result);
|
||||
if (isSetTempData)
|
||||
{
|
||||
baseParameter.CommonTempData = customParameter;
|
||||
}
|
||||
else
|
||||
{
|
||||
AppendMember(parameter, parameter.IsLeft, customParameter);
|
||||
}
|
||||
}
|
||||
|
||||
private string GetCustomParameter(ExpressionParameter parameter, ConstantExpression expression)
|
||||
{
|
||||
string customParameter = null;
|
||||
if (parameter.OppsiteExpression != null)
|
||||
{
|
||||
var exp = ExpressionTool.RemoveConvert(parameter.OppsiteExpression);
|
||||
if (exp is MemberExpression)
|
||||
{
|
||||
var member = (exp as MemberExpression);
|
||||
var memberParent = member.Expression;
|
||||
if (memberParent != null&& this.Context?.SugarContext?.Context!=null)
|
||||
{
|
||||
var entity = this.Context.SugarContext.Context.EntityMaintenance.GetEntityInfo(memberParent.Type);
|
||||
var columnInfo = entity.Columns.FirstOrDefault(it => it.PropertyName == member.Member.Name);
|
||||
if (columnInfo.SqlParameterDbType is Type)
|
||||
{
|
||||
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[] { expression.Value, 100 }) as SugarParameter;
|
||||
customParameter = base.AppendParameter(p);
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
return customParameter;
|
||||
}
|
||||
|
||||
private void DefaultConstant(ExpressionParameter parameter, ConstantExpression expression)
|
||||
{
|
||||
var isLeft = parameter.IsLeft;
|
||||
object value = ExpressionTool.GetValue(expression.Value, this.Context);
|
||||
value = ConvetValue(parameter, expression, value);
|
||||
|
||||
16
Src/Asp.NetCore2/SqlSugar/Interface/ISugarDataConverter.cs
Normal file
16
Src/Asp.NetCore2/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);
|
||||
}
|
||||
}
|
||||
@@ -329,7 +329,7 @@ namespace SqlSugar
|
||||
}
|
||||
}
|
||||
|
||||
internal static Type GetUnderType(Type oldType)
|
||||
public static Type GetUnderType(Type oldType)
|
||||
{
|
||||
Type type = Nullable.GetUnderlyingType(oldType);
|
||||
return type == null ? oldType : type;
|
||||
|
||||
Reference in New Issue
Block a user