From fa9c96aec00596c6306e2e2665efbfe59fefbf24 Mon Sep 17 00:00:00 2001 From: Marc Gravell Date: Fri, 12 Apr 2024 11:13:05 +0100 Subject: [PATCH] revert #2050 - see #2049 for more details (#2070) * revert #2050 - see #2049 for more details --- Dapper/SqlMapper.cs | 15 ++++++----- tests/Dapper.Tests/TypeHandlerTests.cs | 35 +++++++++++++++++--------- 2 files changed, 32 insertions(+), 18 deletions(-) diff --git a/Dapper/SqlMapper.cs b/Dapper/SqlMapper.cs index 5575a6f5f..c63740759 100644 --- a/Dapper/SqlMapper.cs +++ b/Dapper/SqlMapper.cs @@ -193,9 +193,7 @@ public TypeMapEntry(DbType dbType, TypeMapEntryFlags flags) public static readonly TypeMapEntry DoNotSet = new((DbType)(-2), TypeMapEntryFlags.None), DoNotSetFieldValue = new((DbType)(-2), TypeMapEntryFlags.UseGetFieldValue), - DecimalFieldValue = new(DbType.Decimal, TypeMapEntryFlags.SetType | TypeMapEntryFlags.UseGetFieldValue), - StringFieldValue = new(DbType.String, TypeMapEntryFlags.SetType | TypeMapEntryFlags.UseGetFieldValue), - BinaryFieldValue = new(DbType.Binary, TypeMapEntryFlags.SetType | TypeMapEntryFlags.UseGetFieldValue); + DecimalFieldValue = new(DbType.Decimal, TypeMapEntryFlags.SetType | TypeMapEntryFlags.UseGetFieldValue); public static implicit operator TypeMapEntry(DbType dbType) => new(dbType, TypeMapEntryFlags.SetType); @@ -221,13 +219,13 @@ static SqlMapper() [typeof(double)] = DbType.Double, [typeof(decimal)] = DbType.Decimal, [typeof(bool)] = DbType.Boolean, - [typeof(string)] = TypeMapEntry.StringFieldValue, + [typeof(string)] = DbType.String, [typeof(char)] = DbType.StringFixedLength, [typeof(Guid)] = DbType.Guid, [typeof(DateTime)] = TypeMapEntry.DoNotSet, [typeof(DateTimeOffset)] = DbType.DateTimeOffset, [typeof(TimeSpan)] = TypeMapEntry.DoNotSet, - [typeof(byte[])] = TypeMapEntry.BinaryFieldValue, + [typeof(byte[])] = DbType.Binary, [typeof(byte?)] = DbType.Byte, [typeof(sbyte?)] = DbType.SByte, [typeof(short?)] = DbType.Int16, @@ -3928,7 +3926,12 @@ public static void ThrowDataException(Exception ex, int index, IDataReader reade } else { - formattedValue = Convert.ToString(value) + " - " + Type.GetTypeCode(value.GetType()); + formattedValue = Convert.ToString(value) + " - " + Identify(value.GetType()); + } + static string Identify(Type type) + { + var tc = Type.GetTypeCode(type); + return tc == TypeCode.Object ? type.Name : tc.ToString(); } } catch (Exception valEx) diff --git a/tests/Dapper.Tests/TypeHandlerTests.cs b/tests/Dapper.Tests/TypeHandlerTests.cs index 80c3292ff..385ffb90b 100644 --- a/tests/Dapper.Tests/TypeHandlerTests.cs +++ b/tests/Dapper.Tests/TypeHandlerTests.cs @@ -28,12 +28,18 @@ public void TestChangingDefaultStringTypeMappingToAnsiString() SqlMapper.PurgeQueryCache(); - SqlMapper.AddTypeMap(typeof(string), DbType.AnsiString, true); // Change Default String Handling to AnsiString - var result02 = connection.Query(sql, param).FirstOrDefault(); - Assert.Equal("varchar", result02); + SqlMapper.AddTypeMap(typeof(string), DbType.AnsiString, false); // Change Default String Handling to AnsiString + try + { + var result02 = connection.Query(sql, param).FirstOrDefault(); + Assert.Equal("varchar", result02); - SqlMapper.PurgeQueryCache(); - SqlMapper.AddTypeMap(typeof(string), DbType.String, true); // Restore Default to Unicode String + SqlMapper.PurgeQueryCache(); + } + finally + { + SqlMapper.AddTypeMap(typeof(string), DbType.String, false); // Restore Default to Unicode String + } } [Fact] @@ -46,13 +52,18 @@ public void TestChangingDefaultStringTypeMappingToAnsiStringFirstOrDefault() Assert.Equal("nvarchar", result01); SqlMapper.PurgeQueryCache(); + SqlMapper.AddTypeMap(typeof(string), DbType.AnsiString, false); // Change Default String Handling to AnsiString + try + { + var result02 = connection.QueryFirstOrDefault(sql, param); + Assert.Equal("varchar", result02); - SqlMapper.AddTypeMap(typeof(string), DbType.AnsiString, true); // Change Default String Handling to AnsiString - var result02 = connection.QueryFirstOrDefault(sql, param); - Assert.Equal("varchar", result02); - - SqlMapper.PurgeQueryCache(); - SqlMapper.AddTypeMap(typeof(string), DbType.String, true); // Restore Default to Unicode String + SqlMapper.PurgeQueryCache(); + } + finally + { + SqlMapper.AddTypeMap(typeof(string), DbType.String, false); // Restore Default to Unicode String + } } [Fact] @@ -643,7 +654,7 @@ public void Issue149_TypeMismatch_SequentialAccess() { Guid guid = Guid.Parse("cf0ef7ac-b6fe-4e24-aeda-a2b45bb5654e"); var ex = Assert.ThrowsAny(() => connection.Query("select @guid as Id", new { guid }).First()); - Assert.Equal("Error parsing column 0 (Id=n/a - Unable to cast object of type 'System.Guid' to type 'System.String'.)", ex.Message); + Assert.Equal("Error parsing column 0 (Id=cf0ef7ac-b6fe-4e24-aeda-a2b45bb5654e - Guid)", ex.Message); } public class Issue149_Person { public string? Id { get; set; } }