类型处理器< T>似乎并没有被称为 [英] TypeHandler<T> doesn't seem to be called
问题描述
短版
SqlMapper.Query< T>
似乎忽略我的注册类型处理器< T>
的长版
下面是一个简单的查询:
SELECT'富'AS类别名称,200 AS CategoryRating
...这里的两大波苏斯:
公共类RatingValue
{
公众的Int32值{搞定;组; }
// ...一些其他属性等等...
}
公共类MyResult
{
公共字符串类别名称{搞定;组; }
公共RatingValue CategoryRating {搞定;组; }
}
我创建了一个新的类型处理器
实现,它的应的把那CategoryRating 的Int32
到 RatingValue
对象:
公共类RatingValueHandler:SqlMapper.TypeHandler< RatingValue>
{
公众覆盖RatingValue解析(对象的值)
{
如果(值的Int32)
返回新RatingValue(){值=(Int32)已值};
抛出新FormatException(无效的转换RatingValue);
}
公共覆盖无效的SetValue(System.Data.IDbDataParameter参数,RatingValue值)
{
// ...空,范围检查等..
parameter.DbType = System.Data.DbType.Int32;
parameter.Value = Int32.Parse(value.Value);
}
}
现在,运行我的查询之前我加入我的新的处理程序是这样的:
SqlMapper.AddTypeHandler< RatingValue>(新RatingValueHandler());
<$:
然而,当我运行这个p $ p> c.Query< MyResult>(选择'富'AS类别名称,200 AS CategoryRating);
我从小巧玲珑的一个例外 - 它无法解析列1 $ B $结果b口有望的小巧玲珑的火我的自定义类型处理器!
我想我失去了一些东西非常明显。请告诉我,我怎么这么傻是
这是不是你傻!;是我;下面现在是否已通过本地(推到github上); 将部署到的NuGet尽快 现在市面上的NuGet 在v1.27和上图:
公共无效SO24740733_TestCustomValueHandler()
{
Dapper.SqlMapper.AddTypeHandler(RatingValueHandler.Default) ;
无功富= connection.Query< MyResult>(
选择'富'AS类别名称,200 AS CategoryRating)单()。
foo.CategoryName.IsEqualTo(富);
foo.CategoryRating.Value.IsEqualTo(200);
}
公共无效SO24740733_TestCustomValueSingleColumn()
{
Dapper.SqlMapper.AddTypeHandler(RatingValueHandler.Default);
无功富= connection.Query< RatingValue>(
SELECT 200 AS CategoryRating)单()。
foo.Value.IsEqualTo(200);
}
The short version
SqlMapper.Query<T>
seems to ignore my registered TypeHandler<T>
The long version
Here's a simple query:
SELECT 'Foo' AS CategoryName, 200 AS CategoryRating
...and here's two POCOs:
public class RatingValue
{
public Int32 Value { get; set; }
// ... some other properties etc ...
}
public class MyResult
{
public String CategoryName { get; set; }
public RatingValue CategoryRating { get; set; }
}
I've created a new TypeHandler
implementation which should turn that CategoryRating Int32
into a RatingValue
object:
public class RatingValueHandler: SqlMapper.TypeHandler<RatingValue>
{
public override RatingValue Parse(object value)
{
if (value is Int32)
return new RatingValue() { Value = (Int32)value };
throw new FormatException("Invalid conversion to RatingValue");
}
public override void SetValue(System.Data.IDbDataParameter parameter, RatingValue value)
{
// ... null, range checks etc ...
parameter.DbType = System.Data.DbType.Int32;
parameter.Value = Int32.Parse(value.Value);
}
}
Now, before running my query I'm adding my new handler like this:
SqlMapper.AddTypeHandler<RatingValue>(new RatingValueHandler());
However, when I run this:
c.Query<MyResult>("SELECT 'Foo' AS CategoryName, 200 AS CategoryRating");
I get an exception from Dapper - it couldn't parse the results in column 1. I expected Dapper to fire my custom type handler!
I think I'm missing something very, very obvious. Please tell me how silly I am!
It isn't you being silly; it is me; the following now pass locally (pushed to github); will deploy to NuGet soon now available on NuGet in v1.27 and above:
public void SO24740733_TestCustomValueHandler()
{
Dapper.SqlMapper.AddTypeHandler(RatingValueHandler.Default);
var foo = connection.Query<MyResult>(
"SELECT 'Foo' AS CategoryName, 200 AS CategoryRating").Single();
foo.CategoryName.IsEqualTo("Foo");
foo.CategoryRating.Value.IsEqualTo(200);
}
public void SO24740733_TestCustomValueSingleColumn()
{
Dapper.SqlMapper.AddTypeHandler(RatingValueHandler.Default);
var foo = connection.Query<RatingValue>(
"SELECT 200 AS CategoryRating").Single();
foo.Value.IsEqualTo(200);
}
这篇关于类型处理器< T>似乎并没有被称为的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!