【问题标题】:TypeHandler<T> doesn't seem to be called似乎没有调用 TypeHandler<T>
【发布时间】:2014-09-04 14:49:06
【问题描述】:

短版

SqlMapper.Query&lt;T&gt;似乎忽略了我注册的TypeHandler&lt;T&gt;

长版

这是一个简单的查询:

SELECT 'Foo' AS CategoryName, 200 AS CategoryRating

...这里有两个 POCO:

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

我创建了一个新的 TypeHandler 实现,应该将 CategoryRating Int32 转换为 RatingValue 对象:

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

现在,在运行我的查询之前,我要像这样添加我的新处理程序:

SqlMapper.AddTypeHandler<RatingValue>(new RatingValueHandler());

但是,当我运行这个时:

c.Query<MyResult>("SELECT 'Foo' AS CategoryName, 200 AS CategoryRating");

我从 Dapper 那里得到一个异常 - 它无法解析第 1 列中的结果。 我预计 Dapper 会触发我的自定义类型处理程序!

我认为我遗漏了一些非常非常明显的东西。请告诉我我有多傻!

【问题讨论】:

    标签: c# type-conversion dapper


    【解决方案1】:

    这不是你傻;是我;以下现在在本地传递(推送到 github); 将很快部署到 NuGet now available on NuGet v1.27 及更高版本:

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

    【讨论】:

    • SqlMapper.AddTypeHandler(new StringDictionaryValueHandler());公共类 StringDictionaryValueHandler : SqlMapper.TypeHandler> { ... }
    猜你喜欢
    • 1970-01-01
    • 2020-10-12
    • 2018-03-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-02-21
    • 1970-01-01
    相关资源
    最近更新 更多