diff --git a/Dapper/SqlMapper.cs b/Dapper/SqlMapper.cs index 8f3956cab..9c73b8a25 100644 --- a/Dapper/SqlMapper.cs +++ b/Dapper/SqlMapper.cs @@ -1157,7 +1157,7 @@ private static GridReader QueryMultipleImpl(this IDbConnection cnn, ref CommandD cmd = command.SetupCommand(cnn, info.ParamReader); reader = ExecuteReaderWithFlagsFallback(cmd, wasClosed, CommandBehavior.SequentialAccess); - var result = new GridReader(cmd, reader, identity, command.Parameters as DynamicParameters, command.AddToCache); + var result = new GridReader(cmd, reader, identity, command.Parameters as IParameterCallbacks, command.AddToCache); cmd = null; // now owned by result wasClosed = false; // *if* the connection was closed and we got this far, then we now have a reader // with the CloseConnection flag, so the reader will deal with the connection; we diff --git a/Directory.Packages.props b/Directory.Packages.props index 2f91a3cca..b1e42ba41 100644 --- a/Directory.Packages.props +++ b/Directory.Packages.props @@ -38,6 +38,7 @@ + diff --git a/tests/Dapper.Tests/Dapper.Tests.csproj b/tests/Dapper.Tests/Dapper.Tests.csproj index 93b498618..e9eab6b88 100644 --- a/tests/Dapper.Tests/Dapper.Tests.csproj +++ b/tests/Dapper.Tests/Dapper.Tests.csproj @@ -32,6 +32,7 @@ + diff --git a/tests/Dapper.Tests/FakeDbTests.Issue2179.cs b/tests/Dapper.Tests/FakeDbTests.Issue2179.cs new file mode 100644 index 000000000..6000a17af --- /dev/null +++ b/tests/Dapper.Tests/FakeDbTests.Issue2179.cs @@ -0,0 +1,37 @@ +#if !NET481 +using System.Collections.Generic; +using System.Data; +using System.Linq; +using pengdows.crud.fakeDb; +using Xunit; + +namespace Dapper.Tests; + +public sealed class FakeDbIssue2179Tests +{ + [Fact] + public void QueryMultipleInvokesCustomParameterCallbacks() + { + using var connection = new fakeDbConnection(new FakeDataStore()); + connection.EnqueueReaderResult(new[] { new Dictionary { ["Value"] = 1 } }); + connection.Open(); + var parameters = new CallbackParameters(); + + using (var grid = connection.QueryMultiple("select 1", parameters)) + { + Assert.Equal(1, grid.Read().Single()); + } + + Assert.Equal(1, parameters.CompletedCalls); + } + + private sealed class CallbackParameters : SqlMapper.IParameterCallbacks + { + public int CompletedCalls { get; private set; } + + void SqlMapper.IDynamicParameters.AddParameters(IDbCommand command, SqlMapper.Identity identity) { } + + void SqlMapper.IParameterCallbacks.OnCompleted() => CompletedCalls++; + } +} +#endif