Dapper, decimal a doble? Error al analizar la columna X

dapper oracle parsing

Pregunta

Mi base de datos es Oracle. Utilizo Dapper 1.13, que arroja una excepción que dice Error parsing column 3 (LATITUDE=39.2330 - Decimal) . LATITUDE es un double? escribe mi entidad

Por favor, ayúdame.

Gracias

Respuesta aceptada

Sí, eso es un error; lo han arreglado localmente, básicamente, cambia la línea 2367 (wow, ¿cuándo ese archivo se volvió tan grande?) desde:

il.Emit(OpCodes.Ldtoken, unboxType);

a:

il.Emit(OpCodes.Ldtoken, Nullable.GetUnderlyingType(unboxType) ?? unboxType);

Básicamente, está emitiendo: (decimal?)Convert.ChangeType(val, typeof(decimal?)) Cuando debería estar emitiendo (decimal?)Convert.ChangeType(val, typeof(decimal)) (tenga en cuenta lo más importante ? En la typeof ).

Editar: de hecho, la revisión que he llevado a Git es un poco más complejo que la simple fijación de la Convert.ChangeType - se resuelve ahora los operadores según necesidad, por lo que el decimal <===> double conversiones utiliza IL-estática llamada.

Esto se solucionará en la próxima compilación. O puedes construir localmente. Lo siguiente ahora pasa:

public void TestDoubleDecimalConversions_SO18228523_RightWay()
{
    var row = connection.Query<HasDoubleDecimal>(
        "select cast(1 as float) as A, cast(2 as float) as B, cast(3 as decimal) as C, cast(4 as decimal) as D").Single();
    row.A.Equals(1.0);
    row.B.Equals(2.0);
    row.C.Equals(3.0M);
    row.D.Equals(4.0M);
}
public void TestDoubleDecimalConversions_SO18228523_WrongWay()
{
    var row = connection.Query<HasDoubleDecimal>(
        "select cast(1 as decimal) as A, cast(2 as decimal) as B, cast(3 as float) as C, cast(4 as float) as D").Single();
    row.A.Equals(1.0);
    row.B.Equals(2.0);
    row.C.Equals(3.0M);
    row.D.Equals(4.0M);
}
public void TestDoubleDecimalConversions_SO18228523_Nulls()
{
    var row = connection.Query<HasDoubleDecimal>(
        "select cast(null as decimal) as A, cast(null as decimal) as B, cast(null as float) as C, cast(null as float) as D").Single();
    row.A.Equals(0.0);
    row.B.IsNull();
    row.C.Equals(0.0M);
    row.D.IsNull();
}

class HasDoubleDecimal
{
    public double A { get; set; }
    public double? B { get; set; }
    public decimal C { get; set; }
    public decimal? D { get; set; }
}


Licencia bajo: CC-BY-SA with attribution
No afiliado con Stack Overflow
¿Es esto KB legal? Sí, aprende por qué
Licencia bajo: CC-BY-SA with attribution
No afiliado con Stack Overflow
¿Es esto KB legal? Sí, aprende por qué