2014-07-14 73 views
7

短版

SqlMapper.Query<T>似乎忽略我的註冊TypeHandler<T>類型處理器<T>似乎並沒有被稱爲

加長版

這裏有一個簡單的查詢:

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 Int32RatingValue對象:現在

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得到一個異常 - 它無法解析第一列的結果。 I expected小巧玲瓏來激發我的自定義類型處理程序!

我想我錯過了一些非常非常明顯的東西。請告訴我我是多麼的愚蠢!

回答

5

這不是你愚蠢;是我;下面現在通過本地(推到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); 
} 
+0

爲什麼三江源 - 我的帽子的頂端到您,先生:) – Dan

+0

什麼SqlMapper.AddTypeHandler(新StringDictionaryValueHandler()); public class StringDictionaryValueHandler:SqlMapper.TypeHandler > {...} –

相關問題