dotnetcore / SmartSql

SmartSql = MyBatis in C# + .NET Core+ Cache(Memory | Redis) + R/W Splitting + PropertyChangedTrack +Dynamic Repository + InvokeSync + Diagnostics
https://smartsql.net/
Apache License 2.0
1.1k stars 222 forks source link

同一个Statement,如果Select部分的字段是动态的话, 会出现序列化的问题 #94

Closed laiguorong closed 4 years ago

laiguorong commented 5 years ago

SmartSql version

v4.1.23

Database provider and version

mysql

Steps to reproduce

SmartSql.Deserializer.EntityDeserializer.cs private Func<DataReaderWrapper, AbstractRequestContext, TResult> GetDeserialize<TResult>( ExecutionContext executionContext) { var key = GenerateKey(executionContext); return CacheUtil<TypeWrapper<EntityDeserializer, TResult>, String, Delegate>.GetOrAdd(key, _ => CreateDeserialize<TResult>(executionContext)) as Func<DataReaderWrapper, AbstractRequestContext, TResult>; }

Expected result

Actual result

private Func<DataReaderWrapper, AbstractRequestContext, TResult> GetDeserialize<TResult>( ExecutionContext executionContext) { return CreateDeserialize<TResult>(executionContext) as Func<DataReaderWrapper, AbstractRequestContext, TResult>; }

Stack trace

System.FormatException: Input string was not in a correct format. at System.Number.StringToNumber(ReadOnlySpan1 str, NumberStyles options, NumberBuffer& number, NumberFormatInfo info, Boolean parseDecimal) at System.Number.ParseDecimal(ReadOnlySpan1 value, NumberStyles options, NumberFormatInfo numfmt) at System.Convert.ToDecimal(String value, IFormatProvider provider) at MySql.Data.MySqlClient.MySqlDataReader.GetDecimal(Int32 i) at SmartSql.TypeHandlers.NullableDecimalTypeHandler.GetValueWhenNotNull(DataReaderWrapper dataReader, Int32 columnIndex) in C:\projects\smartsql\src\SmartSql\TypeHandlers\Nullables\NullableDecimalTypeHandler.cs:line 13 at SmartSql.TypeHandlers.TypeHandlerCache2.GetValue(DataReaderWrapper dataReader, Int32 columnIndex, Type targetType) in C:\projects\smartsql\src\SmartSql\TypeHandlers\TypeHandlerCache.cs:line 28 at Deserialize1e6b8d9919904037b66e23d44206c850(DataReaderWrapper , AbstractRequestContext ) at SmartSql.Deserializer.EntityDeserializer.ToList[TResult](ExecutionContext executionContext) at SmartSql.Middlewares.ResultHandlerMiddleware.Invoke[TResult](ExecutionContext executionContext) at SmartSql.Middlewares.TransactionMiddleware.Invoke[TResult](ExecutionContext executionContext) at SmartSql.Middlewares.AbstractMiddleware.Invoke[TResult](ExecutionContext executionContext) at SmartSql.DbSession.DefaultDbSession.Invoke[TResult](AbstractRequestContext requestContext) at SmartSql.DbSession.DefaultDbSession.Query[TResult](AbstractRequestContext requestContext) at SmartSql.SqlMapper.ExecuteImpl[TResult](Func2 executeFunc)

Ahoo-Wang commented 5 years ago

用 QueryDynamic