C# 什么会导致精巧的造型失败?
我正在使用Dapper执行一个非常简单的查询: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
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;
}
}