Dapper, десятичный в два раза? Ошибка синтаксического анализа столбца X

dapper oracle parsing

Вопрос

Моя база данных - это Oracle. I пользователь Dapper 1.13, который выдает исключение, говорящий об Error parsing column 3 (LATITUDE=39.2330 - Decimal) . LATITUDE - это double? введите мой объект.

Пожалуйста, помогите мне.

благодаря

Принятый ответ

Да, это ошибка; исправлены локально - в основном, измените строку 2367 (ничего себе, когда этот файл стал настолько большим?) от:

il.Emit(OpCodes.Ldtoken, unboxType);

чтобы:

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

В основном, это излучает: (decimal?)Convert.ChangeType(val, typeof(decimal?)) , Когда она должна быть излучающей (decimal?)Convert.ChangeType(val, typeof(decimal)) (обратите внимание , что все важный ? В typeof ).

Изменить : на самом деле исправление, которое я нажал на git, немного сложнее, чем просто исправление Convert.ChangeType - теперь он разрешает операторы по мере необходимости, поэтому decimal <===> double преобразования используют статический вызов IL.

Это будет исправлено в следующей сборке. Или вы можете создавать локально. Далее идет следующее:

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


Лицензировано согласно: CC-BY-SA with attribution
Не связан с Stack Overflow
Является ли этот КБ законным? Да, узнайте, почему
Лицензировано согласно: CC-BY-SA with attribution
Не связан с Stack Overflow
Является ли этот КБ законным? Да, узнайте, почему