类型处理器< T>似乎并没有被称为 [英] TypeHandler<T> doesn't seem to be called

查看:186
本文介绍了类型处理器< T>似乎并没有被称为的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

短版



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

这篇关于类型处理器&LT; T&GT;似乎并没有被称为的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
相关文章
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆