diff --git a/Dapper/SqlMapper.cs b/Dapper/SqlMapper.cs index 8f3956cab..9c0ddf41f 100644 --- a/Dapper/SqlMapper.cs +++ b/Dapper/SqlMapper.cs @@ -2859,7 +2859,7 @@ private static bool IsValueTuple(Type? type) => (type?.IsValueType == true il.EmitCall(OpCodes.Callvirt, typeof(IDataParameter).GetProperty(nameof(IDataParameter.Value))!.GetSetMethod()!, null);// stack is now [parameters] [[parameters]] [parameter] } - if (prop.PropertyType == typeof(string)) + if (prop.PropertyType == typeof(string) && handler is null) { var endOfSize = il.DefineLabel(); var sizeLocal = GetSizeLocal(); diff --git a/Directory.Packages.props b/Directory.Packages.props index 2f91a3cca..8f2772419 100644 --- a/Directory.Packages.props +++ b/Directory.Packages.props @@ -35,6 +35,7 @@ + diff --git a/tests/Dapper.Tests/Dapper.Tests.csproj b/tests/Dapper.Tests/Dapper.Tests.csproj index 93b498618..09947a89a 100644 --- a/tests/Dapper.Tests/Dapper.Tests.csproj +++ b/tests/Dapper.Tests/Dapper.Tests.csproj @@ -31,8 +31,9 @@ - - + + + diff --git a/tests/Dapper.Tests/FakeDbTests.Issue2141.cs b/tests/Dapper.Tests/FakeDbTests.Issue2141.cs new file mode 100644 index 000000000..51b310b2a --- /dev/null +++ b/tests/Dapper.Tests/FakeDbTests.Issue2141.cs @@ -0,0 +1,49 @@ +#if !NET481 +using System.Data; +using pengdows.crud.fakeDb; +using Xunit; + +namespace Dapper.Tests +{ + public sealed class FakeDbIssue2141Tests + { + [Fact] + public void StringTypeHandlerOwnsParameterSize() + { + SqlMapper.RemoveTypeMap(typeof(string)); + var handler = new SizedStringHandler(); + SqlMapper.AddTypeHandler(handler); + try + { + using var conn = new fakeDbConnection(new FakeDataStore()); + conn.EnqueueNonQueryResult(1); + conn.Open(); + + conn.Execute("select @value", new { value = "hello" }); + + Assert.Equal(7, handler.LastParameter!.Size); + } + finally + { + SqlMapper.ResetTypeHandlers(); + SqlMapper.AddTypeMap(typeof(string), DbType.String); + } + } + + private sealed class SizedStringHandler : SqlMapper.TypeHandler + { + public IDbDataParameter? LastParameter { get; private set; } + + public override string Parse(object value) => (string)value; + + public override void SetValue(IDbDataParameter parameter, string? value) + { + LastParameter = parameter; + parameter.DbType = DbType.String; + parameter.Value = value; + parameter.Size = 7; + } + } + } +} +#endif