2010-10-25 11 views
7

मुझे आश्चर्य है, इस SqlCommand कन्स्ट्रक्टर अधिभार के कारण क्या है:SqlCommand कन्स्ट्रक्टर में SqlConnection और SqlTransaction दोनों क्यों मौजूद हैं?

public SqlCommand(
    string cmdText, 
    SqlConnection connection, 
    SqlTransaction transaction 
) 

?

जब मुझे एक आंतरिक विधि बनाने की आवश्यकता होती है जो तर्क के रूप में प्रदान किए गए लेनदेन का उपयोग करके थोड़ा सा करता है, तो मुझे हमेशा उस विधि में SqlTransaction पास करने के लिए पर्याप्त लगता है, क्योंकि जाहिर है, कनेक्शन tran.Connection होगा।
क्या यह अधिभार इस पर लागू नहीं होता है? क्या यह केवल cmdText और transaction को पास करने के लिए पर्याप्त नहीं होगा?

क्या यह वास्तव में एक कनेक्शन के खिलाफ SqlCommand निष्पादित करना संभव है, xxx23 को विभिन्नSqlConnection के विरुद्ध खोला गया है? इसका नतीजा क्या होगा?

उत्तर

3

यह एक दिलचस्प अवलोकन है क्योंकि आप किसी भिन्न कनेक्शन से लेनदेन का उपयोग नहीं कर सकते हैं।

if ((this._transaction != null) && (this._activeConnection != this._transaction.Connection)) 
{ 
    throw ADP.TransactionConnectionMismatch(); 
} 

SqlCommand वर्ग के समग्र डिजाइन लचीलेपन के लिए है: System.Data.SqlClient.SqlCommand (4.0) एक निजी सदस्य ValidateCommand कहा जाता है कि यह एक सहित कई सत्यापन जांच में शामिल हैं, है। कमांडटेक्स्ट, कनेक्शन और लेनदेन गुण (जो तीन अतिरिक्त कन्स्ट्रक्टर ओवरलोड में भी उजागर होते हैं) पढ़े/लिखते हैं। यह वर्ग को लचीला बनाता है, लेकिन गलत उपयोग के लिए भी प्रवण होता है।

निश्चित रूप से, चीजें बहुत ही साफ हो जाएंगी यदि गुण केवल पढ़ने के लिए और रचनाकारों को वस्तु में डेटा पास करने के प्राथमिक साधन के रूप में उपयोग किया जाता है। ऐसी स्थिति में निम्नलिखित निर्माता भी बहुत कुछ मतलब होगा:

public SqlCommand(string commandText, SqlTransaction transaction) 

हालांकि, मैं कल्पना कर सकते हैं कि इन गुणों/डिफ़ॉल्ट निर्माता का उपयोग कर जहां किसी चीज़ का निर्माण किया है खींचें n ड्रॉप डिजाइनर समर्थन सक्षम करने के लेखन कर रहे हैं और गुण प्रारंभिक कॉम्पोनेंट विधि में सेट हैं।

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