Dapper, décimal à doubler? Erreur d'analyse de la colonne X

dapper oracle parsing

Question

Ma base de données est Oracle. J'utilise Dapper 1.13, qui lève une exception en disant Error parsing column 3 (LATITUDE=39.2330 - Decimal) . LATITUDE est un double? tapez dans mon entité.

Aidez-moi, s'il vous plaît.

Merci

Réponse acceptée

Ouais, c'est un bug; ont fixé localement - fondamentalement, changez la ligne 2367 (wow, quand ce fichier est-il devenu si gros?) de:

il.Emit(OpCodes.Ldtoken, unboxType);

à:

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

Fondamentalement, il émet: (decimal?)Convert.ChangeType(val, typeof(decimal?)) Quand il devrait émettre (decimal?)Convert.ChangeType(val, typeof(decimal)) (notez le tout important ? (decimal?)Convert.ChangeType(val, typeof(decimal)) le typeof ).

Edit : en fait, le correctif que j'ai poussé à git est un peu plus complexe que la simple correction de Convert.ChangeType - il résout désormais les opérateurs en fonction des besoins, de sorte que les double conversions decimal <===> utilisent l'appel statique IL.

Cela sera corrigé dans la prochaine génération. Ou vous pouvez construire localement. Ce qui suit passe maintenant:

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


Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow
Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow