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