Skip to content

Commit 5620943

Browse files
authored
Merge pull request #228 from xiangxiren/Issue219
'修复使用StatementAttribute时,参数前缀未被正确替换'
2 parents 1dce744 + 6c5aaee commit 5620943

File tree

2 files changed

+78
-76
lines changed

2 files changed

+78
-76
lines changed

src/SmartSql.DyRepository/EmitRepositoryBuilder.cs

+67-65
Original file line numberDiff line numberDiff line change
@@ -53,7 +53,7 @@ private void InitAssembly()
5353
private void EmitBuildCtor(string scope, TypeBuilder typeBuilder, FieldBuilder sqlMapperField,
5454
FieldBuilder scopeField)
5555
{
56-
var paramTypes = new Type[] {ISqlMapperType.Type};
56+
var paramTypes = new Type[] { ISqlMapperType.Type };
5757
var ctorBuilder = typeBuilder.DefineConstructor(
5858
MethodAttributes.Public, CallingConventions.Standard, paramTypes);
5959
var ilGen = ctorBuilder.GetILGenerator();
@@ -321,25 +321,27 @@ private Statement PreStatement(Type interfaceType, SqlMap sqlMap, MethodInfo met
321321
StatementType = _statementAnalyzer.Analyse(statementAttr.Sql),
322322
SqlTags = new List<ITag>
323323
{
324-
new SqlText(statementAttr.Sql, sqlMap.SmartSqlConfig.Database.DbProvider.ParameterPrefix)
324+
new SqlText(
325+
statementAttr.Sql.Replace(sqlMap.SmartSqlConfig.Settings.ParameterPrefix,
326+
sqlMap.SmartSqlConfig.Database.DbProvider.ParameterPrefix),
327+
sqlMap.SmartSqlConfig.Database.DbProvider.ParameterPrefix)
325328
},
326329
CommandType = statementAttr.CommandType,
327330
EnablePropertyChangedTrack = statementAttr.EnablePropertyChangedTrack,
328331
ReadDb = statementAttr.ReadDb
329332
};
333+
330334
if (statementAttr.CommandTimeout > 0)
331335
{
332336
statement.CommandTimeout = statementAttr.CommandTimeout;
333337
}
334338

335-
336339
if (statementAttr.SourceChoice != DataSourceChoice.Unknow)
337340
{
338341
statement.SourceChoice = statementAttr.SourceChoice;
339342
}
340343

341344
sqlMap.Statements.Add(statement.FullSqlId, statement);
342-
343345
}
344346

345347
var resultCacheAttr = methodInfo.GetCustomAttribute<ResultCacheAttribute>();
@@ -349,7 +351,6 @@ private Statement PreStatement(Type interfaceType, SqlMap sqlMap, MethodInfo met
349351
statement.Cache = sqlMap.GetCache(statement.CacheId);
350352
}
351353

352-
353354
returnType = isTaskReturnType ? returnType.GetGenericArguments().FirstOrDefault() : returnType;
354355
if (returnType == typeof(DataTable))
355356
{
@@ -406,95 +407,95 @@ private MethodInfo PreExecuteMethod(ExecuteBehavior executeBehavior, Type return
406407
switch (executeBehavior)
407408
{
408409
case ExecuteBehavior.Execute:
409-
{
410-
executeMethod = ISqlMapperType.Method.ExecuteAsync;
411-
break;
412-
}
410+
{
411+
executeMethod = ISqlMapperType.Method.ExecuteAsync;
412+
break;
413+
}
413414

414415
case ExecuteBehavior.ExecuteScalar:
415-
{
416-
executeMethod = ISqlMapperType.Method.ExecuteScalarAsync.MakeGenericMethod(realReturnType);
417-
break;
418-
}
416+
{
417+
executeMethod = ISqlMapperType.Method.ExecuteScalarAsync.MakeGenericMethod(realReturnType);
418+
break;
419+
}
419420

420421
case ExecuteBehavior.QuerySingle:
421-
{
422-
executeMethod = ISqlMapperType.Method.QuerySingleAsync.MakeGenericMethod(realReturnType);
423-
break;
424-
}
422+
{
423+
executeMethod = ISqlMapperType.Method.QuerySingleAsync.MakeGenericMethod(realReturnType);
424+
break;
425+
}
425426

426427
case ExecuteBehavior.Query:
427-
{
428-
var method = ISqlMapperType.Method.QueryAsync;
429-
var enumerableType = realReturnType.GenericTypeArguments[0];
430-
executeMethod = method.MakeGenericMethod(enumerableType);
431-
break;
432-
}
428+
{
429+
var method = ISqlMapperType.Method.QueryAsync;
430+
var enumerableType = realReturnType.GenericTypeArguments[0];
431+
executeMethod = method.MakeGenericMethod(enumerableType);
432+
break;
433+
}
433434

434435
case ExecuteBehavior.GetDataTable:
435-
{
436-
executeMethod = ISqlMapperType.Method.GetDataTableAsync;
437-
break;
438-
}
436+
{
437+
executeMethod = ISqlMapperType.Method.GetDataTableAsync;
438+
break;
439+
}
439440

440441
case ExecuteBehavior.GetDataSet:
441-
{
442-
executeMethod = ISqlMapperType.Method.GetDataSetAsync;
443-
break;
444-
}
442+
{
443+
executeMethod = ISqlMapperType.Method.GetDataSetAsync;
444+
break;
445+
}
445446

446447
default:
447-
{
448-
throw new ArgumentException();
449-
}
448+
{
449+
throw new ArgumentException();
450+
}
450451
}
451452
}
452453
else
453454
{
454455
switch (executeBehavior)
455456
{
456457
case ExecuteBehavior.Execute:
457-
{
458-
executeMethod = ISqlMapperType.Method.Execute;
459-
break;
460-
}
458+
{
459+
executeMethod = ISqlMapperType.Method.Execute;
460+
break;
461+
}
461462

462463
case ExecuteBehavior.ExecuteScalar:
463-
{
464-
executeMethod = ISqlMapperType.Method.ExecuteScalar.MakeGenericMethod(returnType);
465-
break;
466-
}
464+
{
465+
executeMethod = ISqlMapperType.Method.ExecuteScalar.MakeGenericMethod(returnType);
466+
break;
467+
}
467468

468469
case ExecuteBehavior.QuerySingle:
469-
{
470-
executeMethod = ISqlMapperType.Method.QuerySingle.MakeGenericMethod(returnType);
471-
break;
472-
}
470+
{
471+
executeMethod = ISqlMapperType.Method.QuerySingle.MakeGenericMethod(returnType);
472+
break;
473+
}
473474

474475
case ExecuteBehavior.Query:
475-
{
476-
var method = ISqlMapperType.Method.Query;
477-
var enumerableType = returnType.GenericTypeArguments[0];
478-
executeMethod = method.MakeGenericMethod(new Type[] {enumerableType});
479-
break;
480-
}
476+
{
477+
var method = ISqlMapperType.Method.Query;
478+
var enumerableType = returnType.GenericTypeArguments[0];
479+
executeMethod = method.MakeGenericMethod(new Type[] { enumerableType });
480+
break;
481+
}
481482

482483
case ExecuteBehavior.GetDataTable:
483-
{
484-
executeMethod = ISqlMapperType.Method.GetDataTable;
485-
break;
486-
}
484+
{
485+
executeMethod = ISqlMapperType.Method.GetDataTable;
486+
break;
487+
}
487488

488489
case ExecuteBehavior.GetDataSet:
489-
{
490-
executeMethod = ISqlMapperType.Method.GetDataSet;
491-
break;
492-
}
490+
{
491+
executeMethod = ISqlMapperType.Method.GetDataSet;
492+
break;
493+
}
493494

494495
default:
495-
{
496-
throw new ArgumentException();
497-
}
496+
{
497+
throw new ArgumentException();
498+
}
498499
}
499500
}
500501

@@ -547,7 +548,7 @@ private void EmitSetTransaction(ILGenerator ilGen, MethodInfo methodInfo)
547548
var transactionLevel = attrType.GetProperty("Level")?.GetValue(transactionAttribute);
548549
if (transactionLevel != null)
549550
{
550-
isolationLevel = (IsolationLevel) transactionLevel;
551+
isolationLevel = (IsolationLevel)transactionLevel;
551552
}
552553

553554
break;
@@ -654,7 +655,8 @@ private void BuildCache(SqlMap sqlMap, Type interfaceType)
654655
{
655656
Configuration.Cache cache = new Configuration.Cache
656657
{
657-
FlushInterval = new FlushInterval(), Id = ParseCacheFullId(sqlMap.Scope, cacheAttribute.Id)
658+
FlushInterval = new FlushInterval(),
659+
Id = ParseCacheFullId(sqlMap.Scope, cacheAttribute.Id)
658660
};
659661
if (sqlMap.Caches.ContainsKey(cache.Id))
660662
{

src/SmartSql/Deserializer/EntityDeserializer.cs

+11-11
Original file line numberDiff line numberDiff line change
@@ -1,19 +1,18 @@
1-
using SmartSql.Data;
2-
using SmartSql.Exceptions;
3-
using SmartSql.Reflection.TypeConstants;
4-
using System;
1+
using System;
52
using System.Collections.Generic;
63
using System.Data;
74
using System.Linq;
85
using System.Reflection;
96
using System.Reflection.Emit;
107
using System.Threading.Tasks;
118
using Microsoft.Extensions.Logging;
12-
using SmartSql.Annotations;
139
using SmartSql.Configuration;
1410
using SmartSql.CUD;
11+
using SmartSql.Data;
12+
using SmartSql.Exceptions;
1513
using SmartSql.Reflection;
1614
using SmartSql.Reflection.EntityProxy;
15+
using SmartSql.Reflection.TypeConstants;
1716
using SmartSql.TypeHandlers;
1817
using SmartSql.Utils;
1918

@@ -124,7 +123,7 @@ private Delegate CreateDeserialize<TResult>(ExecutionContext executionContext)
124123
.ToDictionary(col => col.ColumnName);
125124

126125
var deserFunc = new DynamicMethod("Deserialize" + Guid.NewGuid().ToString("N"), resultType,
127-
new[] {DataType.DataReaderWrapper, RequestContextType.AbstractType}, resultType, true);
126+
new[] { DataType.DataReaderWrapper, RequestContextType.AbstractType }, resultType, true);
128127
var ilGen = deserFunc.GetILGenerator();
129128
ilGen.DeclareLocal(resultType); // return value
130129
ilGen.DeclareLocal(CommonType.Int32); // current column index
@@ -133,7 +132,7 @@ private Delegate CreateDeserialize<TResult>(ExecutionContext executionContext)
133132

134133
#region New
135134

136-
ConstructorInfo resultCtor = null;
135+
ConstructorInfo resultCtor;
137136
if (constructorMap == null)
138137
{
139138
resultCtor = resultType.GetConstructor(
@@ -171,8 +170,7 @@ private Delegate CreateDeserialize<TResult>(ExecutionContext executionContext)
171170
{
172171
#region Ensure Property & TypeHanlder
173172

174-
if (!ResolveProperty<TResult>(resultMap, resultType, col.Value, out var propertyHolder)
175-
)
173+
if (!ResolveProperty<TResult>(resultMap, resultType, col.Value, out var propertyHolder))
176174
{
177175
continue;
178176
}
@@ -287,9 +285,11 @@ ColumnDescriptor columnDescriptor
287285
{
288286
if (resultMap.Properties.TryGetValue(columnDescriptor.ColumnName, out var resultProperty))
289287
{
288+
var property = resultType.GetProperty(resultProperty.Name) ??
289+
throw new SmartSqlException($"ResultMap:[{resultMap.Id}], can not find property:[{resultProperty.Name}] in class:[{resultType.Name}]");
290290
propertyHolder = new PropertyHolder
291291
{
292-
Property = resultType.GetProperty(resultProperty.Name),
292+
Property = property,
293293
TypeHandler = resultProperty.TypeHandler
294294
};
295295
return true;
@@ -337,7 +337,7 @@ private void LoadPropertyValue(ILGenerator ilGen, ExecutionContext executionCont
337337

338338
#endregion
339339

340-
MethodInfo getValMethod = null;
340+
MethodInfo getValMethod;
341341
if (String.IsNullOrEmpty(typeHandler))
342342
{
343343
LoadTypeHandlerInvokeArgs(ilGen, propertyType);

0 commit comments

Comments
 (0)