C# 什么会导致精巧的造型失败?

C# 什么会导致精巧的造型失败?,c#,oracle,dapper,C#,Oracle,Dapper,我正在使用Dapper执行一个非常简单的查询: const string query = "SELECT measurement From Table;"; return connection.Query<Foo>(query); 它工作得很好。如果我检查结果对象,测量值是一个双精度 但是,如果我明确地将度量值键入为双精度: public class Foo { public double measurement { get; set; } } Dap

我正在使用Dapper执行一个非常简单的查询:

const string query =
          "SELECT measurement From Table;";
return connection.Query<Foo>(query);
它工作得很好。如果我检查结果对象,
测量值
是一个
双精度

但是,如果我明确地将
度量值
键入为
双精度

public class Foo
{
    public double measurement { get; set; }
}
Dapper抛出一个异常:

System.Data.DataException:'分析列0时出错 (测量值=4.64518928527832-双精度)

既然按对象输入是有效的,这并不太烦人,但我想了解是什么导致了这种行为

编辑:用老式的方式做同样的事情,在
测量
输入为
双精度

using (connection)
            {
                connection.Open();
                var cmd = connection.CreateCommand();
                cmd.CommandText = "SELECT measurement From Table;";
                Foo foo= new Foo();
                using (IDataReader reader = cmd.ExecuteReader())
                {
                    reader.Read();
                    foo.measurement = reader.GetDouble(0);
                }
            }
Edit2:堆栈跟踪

Dapper.SqlMapper.ThrowDataException(异常ex,Int32索引,IDataReader读取器,对象值)

也不是内在的例外

System.InvalidCastException/“指定的强制转换无效”


非常有用。

多亏了@haim770,我能够使用最简单的TypeHandler解决这个问题:

public class DoubleTypeHandler : SqlMapper.TypeHandler<double>
{
    public override void SetValue(IDbDataParameter parameter, double value)
    {
        throw new NotImplementedException();
    }

    public override double Parse(object value)
    {
        return value;
    }
}
public类DoubleTypeHandler:SqlMapper.TypeHandler
{
公共覆盖无效设置值(IDbDataParameter参数,双值)
{
抛出新的NotImplementedException();
}
公共重写双解析(对象值)
{
返回值;
}
}

数据库中的测量值是否可以为空?数据库中列的数据类型是什么?我希望它与小数点无关。@haim770是。(无论如何,查询返回的值都不为空。)设置
double?
字段没有改变任何内容。很抱歉,在中找不到
REAL
。我猜它可能是
浮点数
十进制
,或者只是一个丑陋的双精度转换-
(double)(object)
。我想知道你是否偶然发现了一只虫子。
public class DoubleTypeHandler : SqlMapper.TypeHandler<double>
{
    public override void SetValue(IDbDataParameter parameter, double value)
    {
        throw new NotImplementedException();
    }

    public override double Parse(object value)
    {
        return value;
    }
}