2013-03-13 7 views
27

संकलन त्रुटि

'System.Data.SqlClient.SqlConnection' नहीं लागू विधि 'क्वेरी' नाम दिया है, लेकिन उस नाम से एक विस्तार विधि प्रतीत होता है। एक्सटेंशन विधियों को गतिशील रूप से प्रेषित नहीं किया जा सकता है। गतिशील तर्कों को कास्ट करने या एक्सटेंशन विधि वाक्यविन्यास के बिना एक्सटेंशन विधि को कॉल करने पर विचार करें।क्या "विस्तार विधियों को गतिशील रूप से प्रेषित नहीं किया जा सकता" यहां क्या कारण है?

अब, मैं कैसे समस्या को हल करने के लिए पता है, लेकिन मैं खुद को त्रुटि का एक बेहतर समझ पाने के लिए कोशिश कर रहा हूँ। मेरे पास कक्षा है जिसे मैं डेपर का लाभ उठाने के लिए तैयार कर रहा हूं। अंत में मैं अपने प्रकार के डेटा को और अधिक सुव्यवस्थित बनाने के लिए कुछ और कस्टम कार्यक्षमता प्रदान करने जा रहा हूं। विशेष रूप से ट्रेसिंग और सामान में इमारत।

public class Connection : IDisposable 
{ 
    private SqlConnection _connection; 

    public Connection() 
    { 
     var connectionString = Convert.ToString(ConfigurationManager.ConnectionStrings["ConnectionString"]); 
     _connection = new SqlConnection(connectionString); 
     _connection.Open(); 
    } 

    public void Dispose() 
    { 
     _connection.Close(); 
     _connection.Dispose(); 
    } 

    public IEnumerable<dynamic> Query(string sql, dynamic param = null, IDbTransaction transaction = null, bool buffered = true, int? commandTimeout = null, CommandType? commandType = null) 
    { 
     // this one works fine, without compile error, so I understand how to 
     // workaround the error 
     return Dapper.SqlMapper.Query(_connection, sql, param, transaction, buffered, commandTimeout, commandType); 
    } 

    public IEnumerable<T> Query<T>(string sql, dynamic param = null, IDbTransaction transaction = null, bool buffered = true, int? commandTimeout = null, CommandType? commandType = null) 
    { 
     // this one is failing with the error 
     return (IEnumerable<T>)_connection.Query(sql, param, transaction, buffered, commandTimeout, commandType); 
    } 
} 

लेकिन काफी दिलचस्प है, अगर मैं बस इस तरह एक बयान जारी करने के लिए किए गए::

_connection.Query("SELECT * FROM SomeTable"); 

तब भी वह अच्छे संकलित हालांकि, अभी यह इस रूप में सरल है।

तो, क्या कोई मुझे समझने में मदद कर सकता है कि उन अन्य विधियों के अंदर एक ही अधिभार का लाभ उठाने से उस त्रुटि में असफल क्यों हो रहा है?

+0

@pst, पर्याप्त मेला, यह तकनीकी रूप से फेंक नहीं है। –

+2

ऑब्जेक्ट परम के बजाय आपको गतिशील param की आवश्यकता क्यों है? आप इस पर कोई संचालन या विधि कॉल नहीं कर रहे हैं। क्या आप? –

उत्तर

37

तो, क्या कोई मुझे समझने में मदद कर सकता है कि उन अन्य तरीकों के अंदर एक ही अधिभार का लाभ उठाने से उस त्रुटि में असफल क्यों हो रहा है?

सटीक रूप से क्योंकि आप एक गतिशील मान (param) का उपयोग तर्कों में से एक के रूप में कर रहे हैं। इसका मतलब है कि यह गतिशील प्रेषण का उपयोग करेगा ... लेकिन गतिशील प्रेषण एक्सटेंशन विधियों के लिए समर्थित नहीं है। ,

return SqlMapper.Query(_connection, sql, param, transaction, 
         buffered, commandTimeout, commandType); 

(यही कारण है कि आप यह सोचते हैं रहा है वास्तव में, param जरूरत प्रकार dynamic का होना निश्चित रूप से ... के रूप में टिप्पणी में उल्लेख किया आप अच्छी तरह से कर सकते हैं:

समाधान हालांकि आसान है: बस सीधे स्थिर विधि कॉल इसे object पर बदलने के लिए ठीक हो।)

+1

और यह *** है जो मैं *** के लिए देख रहा था, बहुत धन्यवाद जॉन! मुझे इसके आसपास काम करने में कोई समस्या नहीं है, जैसे आपने अपने उदाहरण में किया था, और जैसा कि मैंने पहली विधि में किया था, मैं बस जानना चाहता था *** क्यों *** अगर यह समझ में आता है। और मुझे लगता है कि मैं इसे 'ऑब्जेक्ट' में बदल दूंगा क्योंकि मुझे इसके खिलाफ कोई भी ऑपरेशन करने की आवश्यकता नहीं है। –

+1

@ माइकलपेरनॉउड शायद आपको यह पहले ही मिल गया है, लेकिन इस मामले में 'फू'' एसक्लमैपर 'है; तो 'SqlMapper.Query (...)' –

+0

@MarcGravell: धन्यवाद, तय किया गया। –

1

उसी समस्या का एक और समाधान गतिशील मूल्य पर प्रकार कास्टिंग लागू करना है।

मैं के साथ एक ही संकलन त्रुटि हुई:

Url.Asset("path/" + article.logo); 

कौन सा ऐसा करके हल किया गया था:

Url.Asset("path/" + (string) article.logo); 

नोट: गतिशील मान एक स्ट्रिंग होना करने के लिए अच्छी तरह से जाना, इस मामले में है, वर्तमान में मौजूद स्ट्रिंग कॉन्सटेनेशन द्वारा प्रबलित एक तथ्य।

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

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