Oracle 整洁,十进制到双精度?分析列X时出错

Oracle 整洁,十进制到双精度?分析列X时出错,oracle,parsing,dapper,Oracle,Parsing,Dapper,我的数据库是Oracle。我使用了Dapper 1.13,它抛出了一个异常,表示解析第3列时出错(纬度=39.2330-十进制)。LATITUDE是我的实体中的double?类型 请帮帮我 谢谢是的,这是一个bug;在本地修复-基本上,将第2367行(哇,那个文件什么时候变得这么大?)更改为: 致: 基本上,它正在发出:(十进制?)Convert.ChangeType(val,typeof(十进制?)当它应该发出(十进制?)Convert.ChangeType(val,typeof(十进制))(

我的数据库是Oracle。我使用了Dapper 1.13,它抛出了一个异常,表示解析第3列时出错(纬度=39.2330-十进制)。LATITUDE是我的实体中的
double?
类型

请帮帮我


谢谢

是的,这是一个bug;在本地修复-基本上,将第2367行(哇,那个文件什么时候变得这么大?)更改为:

致:

基本上,它正在发出:
(十进制?)Convert.ChangeType(val,typeof(十进制?)
当它应该发出
(十进制?)Convert.ChangeType(val,typeof(十进制))
(注意
typeof
中最重要的

Edit:实际上,我推送到git的修复程序比修复
Convert.ChangeType
要复杂一些-它现在根据需要解析运算符,因此
十进制
转换使用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; }
}
public void TestDoubleDecimalConversions_SO18228523_RightWay()
{
var row=connection.Query(
“选择强制转换(1为浮点)作为A,强制转换(2为浮点)作为B,强制转换(3为十进制)作为C,强制转换(4为十进制)作为D”)。Single();
第A行等于(1.0);
第B行等于(2.0);
排C等于(3.0M);
D排等于(4.0M);
}
public void TestDoubleDecimalConversions_SO18228523_errowway()
{
var row=connection.Query(
“选择强制转换(1为十进制数)作为A,强制转换(2为十进制数)作为B,强制转换(3为浮点数)作为C,强制转换(4为浮点数)作为D”)。Single();
第A行等于(1.0);
第B行等于(2.0);
排C等于(3.0M);
D排等于(4.0M);
}
public void TestDoubleDecimalConversions_SO18228523_Nulls()
{
var row=connection.Query(
“选择强制转换(null为十进制)作为A,强制转换(null为十进制)作为B,强制转换(null为浮点)作为C,强制转换(null为浮点)作为D”)。Single();
第A行等于(0.0);
行B.IsNull();
排C等于(0.0M);
第D行为空();
}
类具有双十进制
{
公共双精度A{get;set;}
公共双精度B{get;set;}
公共十进制C{get;set;}
公共十进制数?D{get;set;}
}

你能给我们看一下你使用的代码吗?@Hexie-meh,我想这已经足够重新编写了
il.Emit(OpCodes.Ldtoken, Nullable.GetUnderlyingType(unboxType) ?? unboxType);
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; }
}