Dapper, decimale da raddoppiare? Errore durante l'analisi della colonna X

dapper oracle parsing

Domanda

Il mio database è Oracle. Io utente Dapper 1.13, che genera un'eccezione dicendo Error parsing column 3 (LATITUDE=39.2330 - Decimal) . LATITUDE è un double? inserisci la mia entità

Mi aiuti per favore.

Grazie

Risposta accettata

Sì, questo è un bug; hanno risolto localmente - in pratica, cambia la linea 2367 (wow, quando è diventato così grande?) da:

il.Emit(OpCodes.Ldtoken, unboxType);

a:

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

Fondamentalmente, sta emettendo: (decimal?)Convert.ChangeType(val, typeof(decimal?)) Quando dovrebbe emettere (decimal?)Convert.ChangeType(val, typeof(decimal)) (notare l'importantissimo ? il typeof ).

Modifica : in realtà, la correzione che ho spinto a git è un po 'più complessa del semplice aggiustamento di Convert.ChangeType : ora risolve gli operatori in base alle necessità, quindi la double conversione decimal <===> utilizza la chiamata statica IL.

Questo sarà risolto nella prossima build. O puoi costruire localmente. Quanto segue ora passa:

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; }
}


Autorizzato sotto: CC-BY-SA with attribution
Non affiliato con Stack Overflow
È legale questo KB? Sì, impara il perché
Autorizzato sotto: CC-BY-SA with attribution
Non affiliato con Stack Overflow
È legale questo KB? Sì, impara il perché