2014-07-14 5 views
7

लघु संस्करण

SqlMapper.Query<T> मेरे पंजीकृत TypeHandler<T>TypeHandler <T> यहाँ एक सरल प्रश्न है

लंबे संस्करण

अनदेखी करने के लिए लगता है के नाम से जाना प्रतीत नहीं होता:

SELECT 'Foo' AS CategoryName, 200 AS CategoryRating 

। ..और यहां दो पीओसीओ हैं:

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

मुझे डैपर से अपवाद मिलता है - यह कॉलम 1 में परिणाम का विश्लेषण नहीं कर सका। I अपेक्षित डैपर मेरे कस्टम प्रकार हैंडलर को आग लगाने के लिए!

मुझे लगता है कि मैं बहुत, बहुत स्पष्ट कुछ याद कर रहा हूँ। कृपया मुझे बताओ कि मैं कितना मूर्ख हूँ!

उत्तर

5

यह आप मूर्ख नहीं किया जा रहा है, यह मैं हूँ; निम्नलिखित स्थानीय रूप से पास (github करने के लिए धक्का); जल्द हीnow available on NuGet v1.27 में और इसके बाद के संस्करण NuGet को तैनात होगा:

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

क्यों thankyou - आप के लिए मेरे टोपी के एक टिप, सर :) – Dan

+0

क्या SqlMapper.AddTypeHandler के बारे में (नई StringDictionaryValueHandler()); सार्वजनिक वर्ग StringDictionaryValueHandler: SqlMapper.TypeHandler > {...} –

संबंधित मुद्दे