2010-03-09 12 views
9

मैं एक एसक्यूएल बयान है कि मैं OleDb के माध्यम से क्रियान्वित कर रहा हूँ है, बयान कुछ इस तरह है:OleDbParameters और पैरामीटर नाम

INSERT INTO mytable (name, dept) VALUES (@name, @dept); 

मैं इस तरह OleDbCommand लिए पैरामीटर जोड़कर हूँ:

OleDbCommand Command = new OleDbCommand(); 
Command.Connection = Connection; 

OleDbParameter Parameter1 = new OleDbParameter(); 
Parameter1.OleDbType = OleDbType.VarChar; 
Parameter1.ParamterName = "@name"; 
Parameter1.Value = "Bob"; 

OleDbParameter Parameter2 = new OleDbParameter(); 
Parameter2.OleDbType = OleDbType.VarChar; 
Parameter2.ParamterName = "@dept"; 
Parameter2.Value = "ADept"; 

Command.Parameters.Add(Parameter1); 
Command.Parameters.Add(Parameter2); 

समस्या मुझे मिल गया है, अगर मैं दौर दूसरी तरह के आदेश में पैरामीटर जोड़ें, फिर कॉलम गलत मूल्यों के साथ (यानी नाम विभाग स्तंभ और इसके विपरीत में है)

भर जाती है 210

मेरा सवाल यह है कि पैरामीटर नामों का बिंदु क्या है यदि पैरामीटर मान को तालिका में केवल आदेश में दिए गए क्रम में डाला जाता है? पैरामीटर नाम अनावश्यक लगता है?

किसी भी मदद apprreciated, धन्यवाद, गैरेथ

उत्तर

4

पैरामीटर नाम एसक्यूएल समर्थन प्रणाली में जेनेरिक (अर्थात OleDb विशिष्ट नहीं) कर रहे हैं। बहुत अधिक ओलेडीबी/ओडीबीसी उनका उपयोग नहीं करते हैं। वे वहां हैं क्योंकि ओलेडीबी जेनेरिक बेस क्लास का एक विशिष्ट कार्यान्वयन है।

+0

कि थोड़ा परेशान है, है ओह अच्छी तरह से, सही में मान जोड़ने के लिए कोड को संशोधित करना होगा आदेश, धन्यवाद – Gaz

+0

यह बेहद परेशान है। गंभीरता से। और यदि आपने कभी ओडीबीसी को आजमाया है, तो मुझे लगता है कि आप "?" के लिए हैं जैसा कि परम नाम या कुछ ऐसा (लंबे समय पहले);) – TomTom

+0

अजीब, क्योंकि 'डीबी पैरामीटर' के पास पैरामीटर नाम फ़ील्ड नहीं है - आपको लगता है कि अगर 'ओलेडीबी पैरामीटर' पैरामीटर नाम का उपयोग नहीं करता है, तो वे इसे कक्षा में नहीं जोड़ेंगे .. –

11

समस्या यह है कि ओलेडीबी (और ओडीबीसी भी) नामित पैरामीटर का समर्थन नहीं करता है।
यह केवल स्थितित्मक पैरामीटर कहलाता है का समर्थन करता है।

दूसरे शब्दों में: आदेश पैरामीटर सूची में जोड़ते समय आप पैरामीटर देते हैं, इससे कोई फर्क नहीं पड़ता। यह केवल OleDbCommand क्लास द्वारा आंतरिक रूप से उपयोग किया जाता है ताकि यह पैरामीटर को अलग और संदर्भित कर सके।

वह आदेश क्या है जिसमें आप सूची में पैरामीटर जोड़ते हैं। यह वही आदेश होना चाहिए क्योंकि पैरामीटर को प्रश्न चिह्न वर्ण (?) के माध्यम से SQL कथन में संदर्भित किया गया है।

लेकिन यहां एक समाधान है जो आपको SQL कथन में नामित पैरामीटर का उपयोग करने की अनुमति देता है।
यह मूल रूप से प्रश्नपत्रों के साथ SQL कथन में सभी पैरामीटर संदर्भों को प्रतिस्थापित करता है और तदनुसार पैरामीटर सूची को संदर्भित करता है। यह ओडीबीसी कॉमांड क्लास के लिए एक ही तरीके से काम करता है, आपको कोड में "ओडीबीसी" के साथ "ओलेडीबी" को प्रतिस्थापित करने की आवश्यकता है।

इस तरह कोड का उपयोग करें:

command.CommandText = "SELECT * FROM Contact WHERE FirstName = @FirstName"; 
command.Parameters.AddWithValue("@FirstName", "Mike"); 
command.ConvertNamedParametersToPositionalParameters(); 

और यहाँ कोड

public static class OleDbCommandExtensions 
{ 
    public static void ConvertNamedParametersToPositionalParameters(this OleDbCommand command) 
    { 
     //1. Find all occurrences of parameter references in the SQL statement (such as @MyParameter). 
     //2. Find the corresponding parameter in the commands parameters list. 
     //3. Add the found parameter to the newParameters list and replace the parameter reference in the SQL with a question mark (?). 
     //4. Replace the commands parameters list with the newParameters list. 

     var newParameters = new List<OleDbParameter>(); 

     command.CommandText = Regex.Replace(command.CommandText, "(@\\w*)", match => 
     { 
      var parameter = command.Parameters.OfType<OleDbParameter>().FirstOrDefault(a => a.ParameterName == match.Groups[1].Value); 
      if (parameter != null) 
      { 
       var parameterIndex = newParameters.Count; 

       var newParameter = command.CreateParameter(); 
       newParameter.OleDbType = parameter.OleDbType; 
       newParameter.ParameterName = "@parameter" + parameterIndex.ToString(); 
       newParameter.Value = parameter.Value; 

       newParameters.Add(newParameter); 
      } 

      return "?"; 
     }); 

     command.Parameters.Clear(); 
     command.Parameters.AddRange(newParameters.ToArray()); 
    } 
} 
संबंधित मुद्दे