सबसे पहले, पृष्ठभूमि का एक बिट। मेरे प्रश्न के लिए एक विशिष्ट परिदृश्य के लिए प्रश्न पढ़ें और posted here उत्तर दें। मुझे यकीन नहीं है कि अगर अन्य, समान मामले मौजूद हैं लेकिन यह एकमात्र मामला है जिसे मैं जानता हूं।कंपाइलर वैल्यू टाइप रेज़ोल्यूशन और हार्डकोडेड "0" इंटेगर वैल्यू
उपरोक्त "क्विर्क" ऐसा कुछ है जिसे मुझे लंबे समय से पता चला है। मैं हाल ही में कारण की पूरी चौड़ाई को समझ नहीं पाया।
SqlParameter
कक्षा पर माइक्रोसॉफ्ट के दस्तावेज स्थिति पर थोड़ा और प्रकाश डालते हैं।
जब आप मूल्य पैरामीटर में एक
Object
निर्दिष्ट करते हैं,SqlDbType
वस्तु के माइक्रोसॉफ्ट .NET फ्रेमवर्क प्रकार से अनुमान लगाया है।पूर्णांक पैरामीटर मान निर्दिष्ट करने के लिए
SqlParameter
कन्स्ट्रक्टर के इस अधिभार का उपयोग करते समय सावधानी बरतें। चूंकि यह अधिभार प्रकारObject
प्रकार का मान लेता है, तो आपको अभिन्न मान कोObject
टाइप टाइप करना होगा जब मान शून्य है, जैसा कि निम्नलिखित सी # उदाहरण दर्शाता है।
Parameter = new SqlParameter("@pname", Convert.ToInt32(0));
यदि आप करते हैं इस रूपांतरण प्रदर्शन नहीं, संकलक मानता है कि आप SqlParameter (स्ट्रिंग, SqlDbType) निर्माता अधिभार कॉल करने के लिए कोशिश कर रहे हैं ।
(emph।) जोड़ा
मेरा प्रश्न है क्यों करता है संकलक को लगता है कि जब आप एक कठिन कोडित "0" (और केवल मूल्य "0") है कि आप एक निर्दिष्ट करने के लिए कोशिश कर रहे हैं निर्दिष्ट एक पूर्णांक प्रकार के बजाय, गणना प्रकार? इस मामले में, यह मानता है कि आप SqlDbType
मान को 0 के बजाय SqlDbType
मान घोषित कर रहे हैं।
यह गैर-सहज ज्ञान युक्त है और, मामलों को और भी खराब बनाने के लिए, त्रुटि असंगत है। मेरे पास पुराने एप्लिकेशन हैं जिन्हें मैंने लिखा है जिन्हें वर्षों से संग्रहित प्रक्रिया कहा जाता है। मैं एप्लिकेशन में बदलाव करूंगा (अक्सर मेरे SQL सर्वर कक्षाओं से भी जुड़ा नहीं होता), एक अद्यतन प्रकाशित करता है, और यह समस्या अचानक एप्लिकेशन को तोड़ देती है।
कंपेलर मूल्य 0 द्वारा उलझन में क्यों है, जब एकाधिक विधि हस्ताक्षर वाले ऑब्जेक्ट में दो समान समान हस्ताक्षर होते हैं जहां एक पैरामीटर एक ऑब्जेक्ट/पूर्णांक होता है और दूसरा एक गणना स्वीकार करता है?
जैसा कि मैंने उल्लेख किया है, मैंने इसे किसी भी अन्य वर्ग पर किसी अन्य निर्माता या विधि के साथ कभी भी समस्या के रूप में नहीं देखा है। क्या यह SqlParameter
वर्ग के लिए अद्वितीय है या क्या यह एक बग सी #/नेट के भीतर विरासत में है?
सीधे आपके प्रश्न से संबंधित नहीं है, लेकिन मुझे लगता है कि एक नामांकित पैरामीटर ('नया एसक्यूएल पैरामीटर ("@ pname", value: 0) ''' कनवर्ट.ओआईएनटी 32() 'के बजाय एक बेहतर सलाह होगी। – svick
लोग हमेशा डीबीटीपी और लंबाई निर्दिष्ट क्यों नहीं करते हैं? ऐसा नहीं करना समस्या का पता लगाने और योजना कैश को बर्बाद कर देता है। क्या यह सिर्फ कुछ कीस्ट्रोक को बचाने के लिए है या क्या कोई अन्य लाभ है? – adrianm
@adrianm, ऐसा इसलिए है क्योंकि एक निर्माता मौजूद है जो पैरामीटर नाम और मान लेता है। यदि आप इसका उपयोग नहीं कर सकते हैं तो एसकल्प पैरामीटर वर्ग पर कन्स्ट्रक्टर क्यों है? यह कीस्ट्रोक को सहेजने के बारे में नहीं है, यह दो रचनाकारों के बीच छद्म-टकराव होने पर एक वर्ग पर एक कन्स्ट्रक्टर का उपयोग करने के बारे में है क्योंकि कोई एक वस्तु स्वीकार करता है, जहां दूसरा एक गणना स्वीकार करता है। यदि यह "खराब कोडिंग अभ्यास" है, तो निर्माता जो मूल्य लेता है वह पहले स्थान पर मौजूद नहीं होना चाहिए। – RLH