Dapper icon indicating copy to clipboard operation
Dapper copied to clipboard

Problem with DateOnly mapping when updating form v2.1.35 to 2.1.44

Open GonzaloVisma opened this issue 10 months ago • 6 comments

I used to have this custom type handler configured: SqlMapper.AddTypeHandler(new DapperSqlDateOnlyTypeHandler());

Mapping class is:

public class DapperSqlDateOnlyTypeHandler : SqlMapper.TypeHandler<DateOnly>
{
    public override void SetValue(IDbDataParameter parameter, DateOnly date)
        => parameter.Value = date.ToDateTime(new TimeOnly(0, 0));

    public override DateOnly Parse(object value)
        => DateOnly.FromDateTime((DateTime)value);
}

This was working fine, but looks like the DateOnly support was added in 2.1.37 but Now I am getting this error:

System.Data.DataException
Error parsing column 1 (Date=669745 - Int32)
   at Dapper.SqlMapper.ThrowDataException(Exception ex, Int32 index, IDataReader reader, Object value) in /_/Dapper/SqlMapper.cs:line 3948
Inner exception:
InvalidCastException: Unable to cast object of type 'System.DateTime' to type 'System.DateOnly'.

Thing is, the Date column is column 1, but somehow is parsing column 0 value Query result: 669745 2023-11-01 NULL NULL ...

So I am a bit confused, in v2.1.35 I didn't had this problem. I removed custom mapper SqlMapper.AddTypeHandler(new DapperSqlDateOnlyTypeHandler()); and still same problem. Edit: In another query, I set date only field as first one: 2023-11-01 0 0 The error is:

System.Data.DataException
Error parsing column 0 (Date=n/a - Unable to cast object of type 'System.DateTime' to type 'System.DateOnly'.)
   at Dapper.SqlMapper.ThrowDataException(Exception ex, Int32 index, IDataReader reader, Object value) in /_/Dapper/SqlMapper.cs:line 3948
   at Deserialize68929759-6271-4665-a68e-ff25a40601eb(DbDataReader)
   at Dapper.SqlMapper.QueryAsync[T](IDbConnection cnn, Type effectiveType, CommandDefinition command)

The class is:


public record TestClass
{
    public DateOnly Date { get; set; }
    public int First { get; set; }
    public int Second { get; set; }
}

GonzaloVisma avatar Apr 15 '24 08:04 GonzaloVisma

@GonzaloVisma Do you use the System.Data.SqlClient or Microsoft.Data.SqlClient in a combination with Dapper? I have been using the first one with the same workaround you listed above. But recently I have switched to Microsoft.Data.SqlClient and workaroud is not required any more.

mkorsukov avatar Apr 22 '24 14:04 mkorsukov

@GonzaloVisma Do you use the System.Data.SqlClient or Microsoft.Data.SqlClient in a combination with Dapper? I have been using the first one with the same workaround you listed above. But recently I have switched to Microsoft.Data.SqlClient and workaroud is not required any more.

I am using Microsoft.Data.SqlClient already, looks like versions > v2.1.35 are unlisted now, maybe they were several issues with those versions an this was one of them. Also, someone else reported this issue after me https://github.com/DapperLib/Dapper/issues/2072 and in that thread there are more answers of this same problem

GonzaloVisma avatar Apr 23 '24 08:04 GonzaloVisma

@GonzaloVisma Here is my current setup for data-related project:

<ItemGroup>
  <PackageReference Include="Dapper" Version="2.1.37" />
  <PackageReference Include="Microsoft.Data.SqlClient" Version="5.2.0" />
</ItemGroup>

mkorsukov avatar Apr 23 '24 16:04 mkorsukov

@GonzaloVisma Here is my current setup for data-related project:

<ItemGroup>
  <PackageReference Include="Dapper" Version="2.1.37" />
  <PackageReference Include="Microsoft.Data.SqlClient" Version="5.2.0" />
</ItemGroup>

Mine was

<ItemGroup>
  <PackageReference Include="Dapper" Version="2.1.44" />
  <PackageReference Include="Microsoft.Data.SqlClient" Version="5.2.0" />
</ItemGroup>

GonzaloVisma avatar Apr 23 '24 20:04 GonzaloVisma

I have been unable to get a repro of this failing; for now I guess I have no choice except to revert that change, but if anyone who was seeing this problem could show a runnable repro against 2.1.44 (or similar affected), I'd be very grateful

mgravell avatar Apr 26 '24 07:04 mgravell

I have been unable to get a repro of this failing; for now I guess I have no choice except to revert that change, but if anyone who was seeing this problem could show a runnable repro against 2.1.44 (or similar affected), I'd be very grateful

hello @mgravell,

i am experiencing the same issue; i could not produce a runnable repro; but i tried to pin point it; afaik, there is no direct cast from DateTime to DateOnly: image

MSSQL might have a suitable data type that can be casted as DateOnly but i am working with ORACLE and this is not the case here.

i had a custom converter for DateOnly which worked fine before 2.1.44: image

with 2.1.44 my custom converter never gets invoked and i get the cast error.

btw, i expected custom converter to take precedence but that did not work as i expected; so i reverted back to 2.1.35

hope this helps.

akurone avatar Jul 06 '24 14:07 akurone