diff --git a/Dapper/SqlMapper.GridReader.Async.cs b/Dapper/SqlMapper.GridReader.Async.cs index 139b8b27..ed50b697 100644 --- a/Dapper/SqlMapper.GridReader.Async.cs +++ b/Dapper/SqlMapper.GridReader.Async.cs @@ -2,6 +2,7 @@ using System.Collections.Generic; using System.Data; using System.Data.Common; +using System.Globalization; using System.Linq; using System.Threading; using System.Threading.Tasks; @@ -210,7 +211,16 @@ namespace Dapper deserializer = new DeserializerState(hash, GetDeserializer(type, reader, 0, -1, false)); cache.Deserializer = deserializer; } - result = (T)deserializer.Func(reader); + object val = deserializer.Func(reader); + if (val == null || val is T) + { + result = (T)val; + } + else + { + var convertToType = Nullable.GetUnderlyingType(type) ?? type; + result = (T)Convert.ChangeType(val, convertToType, CultureInfo.InvariantCulture); + } if ((row & Row.Single) != 0 && await reader.ReadAsync(cancel).ConfigureAwait(false)) ThrowMultipleRows(row); while (await reader.ReadAsync(cancel).ConfigureAwait(false)) { /* ignore subsequent rows */ } } @@ -230,7 +240,16 @@ namespace Dapper var buffer = new List(); while (index == gridIndex && await reader.ReadAsync(cancel).ConfigureAwait(false)) { - buffer.Add((T)deserializer(reader)); + object val = deserializer(reader); + if (val == null || val is T) + { + buffer.Add((T)val); + } + else + { + var convertToType = Nullable.GetUnderlyingType(typeof(T)) ?? typeof(T); + buffer.Add((T)Convert.ChangeType(val, convertToType, CultureInfo.InvariantCulture)); + } } return buffer; } diff --git a/tests/Dapper.Tests/AsyncTests.cs b/tests/Dapper.Tests/AsyncTests.cs index 34990cb4..5d24512b 100644 --- a/tests/Dapper.Tests/AsyncTests.cs +++ b/tests/Dapper.Tests/AsyncTests.cs @@ -240,6 +240,16 @@ namespace Dapper.Tests } } + [Fact] + public async Task TestMultiConversionAsync() + { + using (SqlMapper.GridReader multi = await connection.QueryMultipleAsync("select Cast(1 as BigInt) Col1; select Cast(2 as BigInt) Col2").ConfigureAwait(false)) + { + Assert.Equal(1, multi.ReadAsync().Result.Single()); + Assert.Equal(2, multi.ReadAsync().Result.Single()); + } + } + [Fact] public async Task TestMultiAsyncViaFirstOrDefault() { diff --git a/tests/Dapper.Tests/QueryMultipleTests.cs b/tests/Dapper.Tests/QueryMultipleTests.cs index 857525dc..47b30456 100644 --- a/tests/Dapper.Tests/QueryMultipleTests.cs +++ b/tests/Dapper.Tests/QueryMultipleTests.cs @@ -31,6 +31,16 @@ namespace Dapper.Tests } } + [Fact] + public void TestMultiConversion() + { + using (SqlMapper.GridReader multi = connection.QueryMultiple("select Cast(1 as BigInt) Col1; select Cast(2 as BigInt) Col2")) + { + Assert.Equal(1, multi.Read().Single()); + Assert.Equal(2, multi.Read().Single()); + } + } + [Fact] public void TestQueryMultipleNonBufferedIncorrectOrder() {