2014-07-14 14 views
7

Phiên bản ngắn

SqlMapper.Query<T> dường như bỏ qua đăng ký của tôi TypeHandler<T>TypeHandler <T> dường như không được gọi

Phiên bản dài

Dưới đây là một truy vấn đơn giản:

SELECT 'Foo' AS CategoryName, 200 AS CategoryRating 

. ..và đây là hai 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; } 
} 

Tôi đã tạo một TypeHandler thực hiện mới mà nên biến mà CategoryRating Int32 vào một đối tượng 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); 
    } 
} 

Bây giờ, trước khi chạy truy vấn của tôi tôi thêm xử lý mới của tôi như thế này:

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

Tuy nhiên, khi tôi chạy điều này:

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

Tôi nhận được ngoại lệ từ Dapper - nó không thể phân tích cú pháp kết quả trong cột 1. Tôi mong đợi Dapper để kích hoạt trình xử lý loại tùy chỉnh của tôi!

Tôi nghĩ rằng tôi đang thiếu thứ gì đó rất, rất rõ ràng. Vui lòng cho tôi biết tôi thật ngốc nghếch!

Trả lời

5

Nó không phải là bạn đang ngớ ngẩn; tôi đây; sau đây bây giờ vượt qua tại địa phương (đẩy đến github); sẽ triển khai đến NuGet sớmnow available on NuGet trong v1.27 trở lên:

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

Tại sao thankyou - một đỉnh của mũ của tôi với bạn, thưa ông :) – Dan

+0

gì về SqlMapper.AddTypeHandler (StringDictionaryValueHandler mới()); lớp công khai StringDictionaryValueHandler: SqlMapper.TypeHandler > {...} –

Các vấn đề liên quan