2011-07-14 9 views
8

मैं एक प्रणाली मूल रूप से इस तरह एक प्रश्न करना है जो मिल गया है के रूप में एसक्यूएल स्थानिक प्रकार के साथ साफ-सुथरी का उपयोग करना:एक पैरामीटर

SELECT * FROM MyTable WHERE @parameter.STIntersects(MyGeometryColumn) 

यह जब वेनिला एसक्यूएल पैरामीटर्स का उपयोग करने के लिए काफी सरल है, तो आप सिर्फ है एक गैर विशिष्ट तरीके से अपने पैरामीटर बनाने के लिए (जहां बिल्डर चर एक SqlGeometryBuilder जो मैं एक आयत बनाने के लिए उपयोग न करें):

command.Parameters.Add(new SqlParameter 
{ 
    UdtTypeName = "geometry", 
    Value = builder.ConstructedGeometry, 
    ParameterName = "@paremeter" 
}); 

अब, जब मैं व्यवसायिक उपयोग करते हुए यह करने के लिए प्रयास करते हैं, मैं कोई त्रुटि मिलती है कि यह पैरामीटर के रूप में इसका उपयोग करने का तरीका नहीं समझ सकता है। कोई भी जिसने यह काम किया है, या इसे सक्षम करने के तरीके पर कोई संकेतक? मेरे पास एक वर्कअराउंड है, लेकिन इसमें स्ट्रिंग प्रस्तुति का उपयोग करना और इसे मेरी SQL क्वेरी में ज्यामिति प्रकार में परिवर्तित करना शामिल है। मैं वास्तव में यह नहीं चाहता।

टिप्पणी का उत्तर देने के लिए, मुझे जो त्रुटि मिल रही है वह है 'माइक्रोसॉफ्ट.SqlServer.Types.SqlGeometry का सदस्य पैरामीटर पैरामीटर मान के रूप में उपयोग नहीं किया जा सकता है'। दूसरे शब्दों में, डैपर को पता नहीं है कि एक एसक्यूएलमेट्री ऑब्जेक्ट को पैरामीटर के रूप में कैसे निपटाना है।

public interface IDynamicParameters 
{ 
    void AddParameters(IDbCommand command); 
} 

डैप्पर पहले से ही इस इंटरफ़ेस कहा जाता है की एक डीबी सामान्य कार्यान्वयन है:

+0

आपको क्या त्रुटि मिल रही है? –

उत्तर

10

अजीब और अद्भुत डीबी विशिष्ट पैरामीटर सभी को लागू करने के लिए महत्वपूर्ण SqlMapper.IDynamicParameters

यह सरल अंतरफलक एक भी अंत बिंदु है करने पर निर्भर करता: DynamicParameters जो आपको आउटपुट को संभालने और मूल्यों को वापस करने की अनुमति देता है।

इस स्थानिक सामान मैं की तरह कुछ की कोशिश करेगा अनुकरण करने के लिए:

public class SpatialParam : SqlMapper.IDynamicParameters 
{ 
    string name; 
    object val; 

    public SpatialParam(string name, object val) 
    { 
     this.name = name; 
     this.val = val; 
    } 

    public void AddParameters(IDbCommand command, SqlMapper.Identity identity) 
    { 
     var sqlCommand = (SqlCommand)command; 
     sqlCommand.Parameters.Add(new SqlParameter 
     { 
      UdtTypeName = "geometry", 
      Value = val, 
      ParameterName = name 
     }); 
    } 
} 

उपयोग:

cnn.Query("SELECT * FROM MyTable WHERE @parameter.STIntersects(MyGeometryColumn)", 
    new SpatialParam("@parameter", builder.ConstructedGeometry)); 

इंटरफ़ेस का यह सरल कार्यान्वयन केवल एक ही परम संभालती है, लेकिन यह आसानी से कर सकते हैं कन्स्ट्रक्टर से गुजरकर या एक सहायक एडपैमरेटर विधि जोड़कर, एकाधिक पैरा को संभालने के लिए बढ़ाया जाए।

+0

यह पूरी तरह से काम करता है!धन्यवाद :) –

+0

नोट: डैपर का वर्तमान संस्करण (इस टिप्पणी को लिखने के रूप में) में थोड़ा अलग इंटरफ़ेस विधि हस्ताक्षर है, अब => 'शून्य जोड़ें पैरामीटर (आईडीबीकॉमांड कमांड, एसक्लैम्पपर.इडेन्टिटी पहचान)' –

5

आप अपने मूल पर साफ-सुथरी संशोधित तो आप उपयोग कर सकते हैं मैं क्या किया है कोई आपत्ति नहीं है ... https://gist.github.com/brendanmckenzie/4961483

मैं Microsoft.SqlServer.Types.SqlGeography पैरामीटर स्वीकार करने के लिए साफ-सुथरी संशोधित।

1
  • Dapper.EntityFramework 1.26 के लिए DbGeography
  • डैप्पर 1.32 समर्थन हासिल है के लिए SqlGeography
  • डैप्पर 1.33 इनबिल्ट समर्थन Dapper.EntityFramework 1.33 के लिए DbGeometry
  • डैप्पर इनबिल्ट समर्थन हासिल है SqlGeometry
  • के लिए इनबिल्ट समर्थन हासिल है है 1.34 में SqlHierarchyId
0 के लिए अंतर्निहित समर्थन है

तो नवीनतम पुस्तकालयों के साथ; यह बस काम करना चाहिए।

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