Synchronization code

This commit is contained in:
sunkaixuan
2023-03-04 16:46:32 +08:00
parent 67bfc2697b
commit a9cc067764
12 changed files with 219 additions and 24 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);
@@ -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);

View File

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

View File

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

View File

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

View File

@@ -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 + "";
// }
//}
}
}

View File

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

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

View File

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

View File

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

View File

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

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

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