Skip to content

Commit fdfdb6f

Browse files
committed
fix TypeDeserializer bug when resultType is String
1 parent 283efb7 commit fdfdb6f

File tree

7 files changed

+119
-104
lines changed

7 files changed

+119
-104
lines changed

build/version.props

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
<PropertyGroup>
33
<VersionMajor>4</VersionMajor>
44
<VersionMinor>1</VersionMinor>
5-
<VersionPatch>54</VersionPatch>
5+
<VersionPatch>55</VersionPatch>
66
<VersionPrefix>$(VersionMajor).$(VersionMinor).$(VersionPatch)</VersionPrefix>
77
</PropertyGroup>
88
</Project>

sample/SmartSql.Sample.AspNetCore/Maps/User.xml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818
<MultipleResultMap Id="QueryByPageResult">
1919
<Result Property="List"/>
2020
<Result Property="Total"/>
21+
<Result Property="UserName"/>
2122
</MultipleResultMap>
2223
</MultipleResultMaps>
2324
<Statements>
@@ -96,6 +97,7 @@
9697
Limit @PageSize Offset 0;
9798
Select Count(1) From T_User T
9899
<Include RefId="QueryParams"/>;
100+
Select 'SmartSql';
99101
</Statement>
100102

101103
<!--获取记录数-->

sample/SmartSql.Sample.AspNetCore/SmartSql.Sample.AspNetCore.csproj

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,8 @@
99
<PackageReference Include="Microsoft.AspNetCore.App" />
1010
<PackageReference Include="Microsoft.AspNetCore.Razor.Design" Version="2.2.0" PrivateAssets="All" />
1111
<PackageReference Include="Microsoft.VisualStudio.Web.CodeGeneration.Design" Version="2.2.3" />
12+
<PackageReference Include="SkyAPM.Agent.AspNetCore" Version="0.9.0" />
13+
<PackageReference Include="SkyAPM.Diagnostics.SmartSql" Version="0.9.0" />
1214
<PackageReference Include="Swashbuckle.AspNetCore" Version="4.0.1" />
1315
<PackageReference Include="System.Data.SQLite" Version="1.0.111" />
1416
</ItemGroup>

sample/SmartSql.Sample.AspNetCore/Startup.cs

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,8 @@
66
using Microsoft.EntityFrameworkCore.Metadata;
77
using Microsoft.Extensions.Configuration;
88
using Microsoft.Extensions.DependencyInjection;
9+
using SkyApm.Diagnostics.SmartSql;
10+
using SkyApm.Utilities.DependencyInjection;
911
using SmartSql.Cache.Sync;
1012
using SmartSql.ConfigBuilder;
1113
using SmartSql.DIExtension;
@@ -29,6 +31,7 @@ public Startup(IConfiguration configuration)
2931
// This method gets called by the runtime. Use this method to add services to the container.
3032
public IServiceProvider ConfigureServices(IServiceCollection services)
3133
{
34+
// services.AddSkyApmExtensions().AddSmartSql();
3235
services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_2);
3336
services
3437
.AddSmartSql((sp, builder) =>
Lines changed: 96 additions & 93 deletions
Original file line numberDiff line numberDiff line change
@@ -1,96 +1,99 @@
11
<?xml version="1.0" encoding="utf-8" ?>
22
<SmartSqlMapConfig xmlns="http://SmartSql.net/schemas/SmartSqlMapConfig.xsd">
3-
<Settings IgnoreParameterCase="false" ParameterPrefix="$" IsCacheEnabled="true" EnablePropertyChangedTrack="true" IgnoreDbNull="true"/>
4-
<Properties>
5-
<!-- <Property Name="Redis" Value="localhost"/>-->
6-
<Property Name="DbProvider" Value="MsSqlServer"/>
7-
<Property Name="ConnectionString" Value="Data Source=.;Initial Catalog=SmartSqlTestDB;Integrated Security=True"/>
8-
<Property Name="JsonTypeHandler`" Value="SmartSql.TypeHandler.JsonTypeHandler`1,SmartSql.TypeHandler"/>
9-
<Property Name="JsonTypeHandler" Value="SmartSql.TypeHandler.JsonTypeHandler,SmartSql.TypeHandler"/>
10-
<Property Name="ScriptBuilder" Value="SmartSql.ScriptTag.ScriptBuilder,SmartSql.ScriptTag"/>
11-
<Property Name="RedisCacheProvider" Value="SmartSql.Cache.Redis.RedisCacheProvider,SmartSql.Cache.Redis"/>
12-
</Properties>
13-
<AutoConverters>
14-
<AutoConverter Name="NoneConverter">
15-
<Tokenizer Name="None"/>
16-
<Converter Name="None"/>
17-
</AutoConverter>
18-
<AutoConverter Name="Default" Default="true">
19-
<Tokenizer Name="Default"/>
20-
<Converter Name="Pascal"/>
21-
</AutoConverter>
22-
<AutoConverter Name="PascalConverter">
23-
<Tokenizer Name="Default">
24-
<Properties>
25-
<Property Name="IgnorePrefix" Value="" />
26-
<Property Name="Delimiter" Value="_" />
27-
<Property Name="UppercaseSplit" Value="false" />
28-
</Properties>
29-
</Tokenizer>
30-
<Converter Name="Pascal"/>
31-
</AutoConverter>
32-
<AutoConverter Name="DelimiterConverter">
33-
<Tokenizer Name="Default">
34-
<Properties>
35-
<Property Name="IgnorePrefix" Value="col_" />
36-
<Property Name="Delimiter" Value="_" />
37-
<Property Name="UppercaseSplit" Value="true" />
38-
</Properties>
39-
</Tokenizer>
40-
<Converter Name="Delimiter">
41-
<Properties>
42-
<Property Name="Prefix" Value="Col_" />
43-
<Property Name="Delimiter" Value="_"/>
44-
<Property Name="Mode" Value="FirstUpper"/>
45-
</Properties>
46-
</Converter>
47-
</AutoConverter>
48-
</AutoConverters>
49-
<Database>
50-
<!-- MsSqlServer: Microsoft.Data.SqlClient , SqlServer: System.Data.SqlClinet -->
51-
<DbProvider Name="${DbProvider}"/>
52-
<Write Name="WriteDB" ConnectionString="${ConnectionString}"/>
53-
<Read Name="ReadDb-1" ConnectionString="${ConnectionString}" Weight="100"/>
54-
<Read Name="ReadDb-2" ConnectionString="${ConnectionString}" Weight="100"/>
55-
</Database>
56-
<TypeHandlers>
57-
<TypeHandler PropertyType="SmartSql.Test.Entities.UserInfo,SmartSql.Test" Type="${JsonTypeHandler`}">
58-
<Properties>
59-
<Property Name="DateFormat" Value="yyyy-MM-dd mm:ss"/>
60-
<Property Name="NamingStrategy" Value="Camel"/>
61-
</Properties>
62-
</TypeHandler>
63-
<TypeHandler Name="AnsiStringTypeHandler" Type="SmartSql.TypeHandlers.StringTypeHandler,SmartSql">
64-
<Properties>
65-
<Property Name="DbType" Value="AnsiString"/>
66-
</Properties>
67-
</TypeHandler>
68-
<TypeHandler Name="AnsiStringFixedLengthTypeHandler" Type="SmartSql.TypeHandlers.StringTypeHandler,SmartSql">
69-
<Properties>
70-
<Property Name="DbType" Value="AnsiStringFixedLength"/>
71-
</Properties>
72-
</TypeHandler>
73-
<TypeHandler Name="Json" Type="${JsonTypeHandler}"></TypeHandler>
74-
</TypeHandlers>
75-
<TagBuilders>
76-
<TagBuilder Name="Script" Type="${ScriptBuilder}"/>
77-
</TagBuilders>
78-
<IdGenerators>
79-
<IdGenerator Name="SnowflakeId" Type="SnowflakeId">
80-
<Properties>
81-
<Property Name="WorkerIdBits" Value="9"/>
82-
<Property Name="WorkerId" Value="511"/>
83-
<Property Name="Sequence" Value="14"/>
84-
</Properties>
85-
</IdGenerator>
86-
<IdGenerator Name="DbSequence" Type="DbSequence">
87-
<Properties>
88-
<Property Name="Step" Value="10"/>
89-
<Property Name="SequenceSql" Value="Select Next Value For IdSequence;"/>
90-
</Properties>
91-
</IdGenerator>
92-
</IdGenerators>
93-
<SmartSqlMaps>
94-
<SmartSqlMap Path="Maps" Type="Directory"></SmartSqlMap>
95-
</SmartSqlMaps>
3+
<Settings IgnoreParameterCase="false" ParameterPrefix="$" IsCacheEnabled="true" EnablePropertyChangedTrack="true"
4+
IgnoreDbNull="true"/>
5+
<Properties>
6+
<!-- <Property Name="Redis" Value="localhost"/>-->
7+
<Property Name="DbProvider" Value="MsSqlServer"/>
8+
<Property Name="ConnectionString"
9+
Value="Data Source=.;Initial Catalog=SmartSqlTestDB;Integrated Security=True"/>
10+
<Property Name="JsonTypeHandler`" Value="SmartSql.TypeHandler.JsonTypeHandler`1,SmartSql.TypeHandler"/>
11+
<Property Name="JsonTypeHandler" Value="SmartSql.TypeHandler.JsonTypeHandler,SmartSql.TypeHandler"/>
12+
<Property Name="ScriptBuilder" Value="SmartSql.ScriptTag.ScriptBuilder,SmartSql.ScriptTag"/>
13+
<Property Name="RedisCacheProvider" Value="SmartSql.Cache.Redis.RedisCacheProvider,SmartSql.Cache.Redis"/>
14+
</Properties>
15+
<AutoConverters>
16+
<AutoConverter Name="NoneConverter">
17+
<Tokenizer Name="None"/>
18+
<Converter Name="None"/>
19+
</AutoConverter>
20+
<AutoConverter Name="Default" Default="true">
21+
<Tokenizer Name="Default"/>
22+
<Converter Name="Pascal"/>
23+
</AutoConverter>
24+
<AutoConverter Name="PascalConverter">
25+
<Tokenizer Name="Default">
26+
<Properties>
27+
<Property Name="IgnorePrefix" Value=""/>
28+
<Property Name="Delimiter" Value="_"/>
29+
<Property Name="UppercaseSplit" Value="false"/>
30+
</Properties>
31+
</Tokenizer>
32+
<Converter Name="Pascal"/>
33+
</AutoConverter>
34+
<AutoConverter Name="DelimiterConverter">
35+
<Tokenizer Name="Default">
36+
<Properties>
37+
<Property Name="IgnorePrefix" Value="col_"/>
38+
<Property Name="Delimiter" Value="_"/>
39+
<Property Name="UppercaseSplit" Value="true"/>
40+
</Properties>
41+
</Tokenizer>
42+
<Converter Name="Delimiter">
43+
<Properties>
44+
<Property Name="Prefix" Value="Col_"/>
45+
<Property Name="Delimiter" Value="_"/>
46+
<Property Name="Mode" Value="FirstUpper"/>
47+
</Properties>
48+
</Converter>
49+
</AutoConverter>
50+
</AutoConverters>
51+
<Database>
52+
<!-- MsSqlServer: Microsoft.Data.SqlClient , SqlServer: System.Data.SqlClinet -->
53+
<DbProvider Name="${DbProvider}"/>
54+
<Write Name="WriteDB" ConnectionString="${ConnectionString}"/>
55+
<Read Name="ReadDb-1" ConnectionString="${ConnectionString}" Weight="100"/>
56+
<Read Name="ReadDb-2" ConnectionString="${ConnectionString}" Weight="100"/>
57+
</Database>
58+
<TypeHandlers>
59+
<TypeHandler PropertyType="SmartSql.Test.Entities.UserInfo,SmartSql.Test" Type="${JsonTypeHandler`}">
60+
<Properties>
61+
<Property Name="DateFormat" Value="yyyy-MM-dd mm:ss"/>
62+
<Property Name="NamingStrategy" Value="Camel"/>
63+
</Properties>
64+
</TypeHandler>
65+
<TypeHandler Name="AnsiStringTypeHandler" Type="SmartSql.TypeHandlers.StringTypeHandler,SmartSql">
66+
<Properties>
67+
<Property Name="DbType" Value="AnsiString"/>
68+
</Properties>
69+
</TypeHandler>
70+
<TypeHandler Name="AnsiStringFixedLengthTypeHandler" Type="SmartSql.TypeHandlers.StringTypeHandler,SmartSql">
71+
<Properties>
72+
<Property Name="DbType" Value="AnsiStringFixedLength"/>
73+
</Properties>
74+
</TypeHandler>
75+
<TypeHandler Name="Json" Type="${JsonTypeHandler}"></TypeHandler>
76+
77+
</TypeHandlers>
78+
<TagBuilders>
79+
<TagBuilder Name="Script" Type="${ScriptBuilder}"/>
80+
</TagBuilders>
81+
<IdGenerators>
82+
<IdGenerator Name="SnowflakeId" Type="SnowflakeId">
83+
<Properties>
84+
<Property Name="WorkerIdBits" Value="9"/>
85+
<Property Name="WorkerId" Value="511"/>
86+
<Property Name="Sequence" Value="14"/>
87+
</Properties>
88+
</IdGenerator>
89+
<IdGenerator Name="DbSequence" Type="DbSequence">
90+
<Properties>
91+
<Property Name="Step" Value="10"/>
92+
<Property Name="SequenceSql" Value="Select Next Value For IdSequence;"/>
93+
</Properties>
94+
</IdGenerator>
95+
</IdGenerators>
96+
<SmartSqlMaps>
97+
<SmartSqlMap Path="Maps" Type="Directory"></SmartSqlMap>
98+
</SmartSqlMaps>
9699
</SmartSqlMapConfig>

src/SmartSql.Test/DTO/GetByPageResponse.cs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,5 +8,6 @@ public class GetByPageResponse<TItem>
88
{
99
public IEnumerable<TItem> List { get; set; }
1010
public int Total { get; set; }
11+
public String UserName { get; set; }
1112
}
12-
}
13+
}
Lines changed: 13 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,35 +1,36 @@
11
using System;
2-
using System.Collections.Generic;
32
using System.Reflection;
43
using System.Reflection.Emit;
5-
using System.Text;
6-
using SmartSql.Configuration;
74
using SmartSql.Reflection.TypeConstants;
85
using SmartSql.Utils;
96

107
namespace SmartSql.Deserializer
118
{
129
public class TypeDeserializer
1310
{
14-
public static object Deserialize(Type resultType, IDataReaderDeserializer deserializer, ExecutionContext executionContext)
11+
public static object Deserialize(Type resultType, IDataReaderDeserializer deserializer,
12+
ExecutionContext executionContext)
1513
{
1614
return GetImpl(resultType)(deserializer, executionContext);
1715
}
1816

1917
private static Func<IDataReaderDeserializer, ExecutionContext, object> GetImpl(Type resultType)
2018
{
2119
return CacheUtil<TypeDeserializer, Type, Func<IDataReaderDeserializer, ExecutionContext, object>>
22-
.GetOrAdd(resultType, CreateImpl);
20+
.GetOrAdd(resultType, CreateImpl);
2321
}
2422

2523
private static Func<IDataReaderDeserializer, ExecutionContext, object> CreateImpl(Type resultType)
2624
{
27-
var dynamicMethod = new DynamicMethod("CreateGetResult_" + Guid.NewGuid().ToString("N"), CommonType.Object, new[] { IDataReaderDeserializerType.Type, ExecutionContextType.Type });
25+
var dynamicMethod = new DynamicMethod("CreateGetResult_" + Guid.NewGuid().ToString("N"), CommonType.Object,
26+
new[] {IDataReaderDeserializerType.Type, ExecutionContextType.Type});
2827
var ilGen = dynamicMethod.GetILGenerator();
2928
ilGen.LoadArg(0);
3029
ilGen.LoadArg(1);
3130
MethodInfo deserMethod;
32-
if (CommonType.IEnumerable.IsAssignableFrom(resultType))
31+
if (
32+
CommonType.IEnumerable.IsAssignableFrom(resultType)
33+
&& resultType != CommonType.String)
3334
{
3435
var listItemType = resultType.GenericTypeArguments[0];
3536
deserMethod = IDataReaderDeserializerType.Method.MakeGenericToList(listItemType);
@@ -38,13 +39,16 @@ private static Func<IDataReaderDeserializer, ExecutionContext, object> CreateImp
3839
{
3940
deserMethod = IDataReaderDeserializerType.Method.MakeGenericToSingle(resultType);
4041
}
42+
4143
ilGen.Callvirt(deserMethod);
4244
if (resultType.IsValueType)
4345
{
4446
ilGen.Box(resultType);
4547
}
48+
4649
ilGen.Return();
47-
return (Func<IDataReaderDeserializer, ExecutionContext, object>)dynamicMethod.CreateDelegate(typeof(Func<IDataReaderDeserializer, ExecutionContext, object>));
50+
return (Func<IDataReaderDeserializer, ExecutionContext, object>) dynamicMethod.CreateDelegate(
51+
typeof(Func<IDataReaderDeserializer, ExecutionContext, object>));
4852
}
4953
}
50-
}
54+
}

0 commit comments

Comments
 (0)