2008-12-17 7 views
62

का उपयोग करना समाप्त होता है यदि मैं किसी प्रयोग में SQLConnection लपेटता हूं, तो क्या मुझे इसे बंद करना चाहिए या इसे संभालकर अंत करना चाहिए?अंत में एक खुले एसक्यूएल कनेक्शन

using cn as new system.data.sqlclient.sqlconnection() 
    cn.open 
    '{do a bunch of other stuff with commands and datareaders here} 
    cn.close 'Do I need this? 
end using 

उत्तर

94

एक का उपयोग कर ब्लॉक बाहर निकल रहा है कॉल .Dispose() (अपने उदाहरण में cn) प्रश्न में वस्तु पर जो एक SqlConnection के लिए कनेक्शन और किसी भी खुले संसाधन बंद हो जाएगा।

+41

दूसरे शब्दों में: हाँ। –

+3

क्या होगा यदि उपयोग ब्लॉक के भीतर कोई अपवाद फेंक दिया गया हो? कनेक्शन अभी भी निपटान हो जाएगा? – Youssef

+10

जोएल कोहुओर्न का हां। अस्पष्ट है। पूरा जवाब यह है: "आपको इसे बंद करने की आवश्यकता नहीं है क्योंकि अंत में इसे संभालने का अंत" –

30

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

+1

क्षमा करें .. आप कहते हैं कि कॉल करना निपटाना बंद करें या बंद करें "वास्तव में इसे बंद नहीं करता है", तो आप कहते हैं "कॉलिंग निपटान पूल से कनेक्शन वापस कर देगा"। क्या आप स्पष्ट कर सकते हो? ए) क्या इसे बंद करें * और * इसे पूल में वापस कर दें? बी) क्या बंद करने के बाद इसे बंद करने के लिए बंद कर देता है? या यह केवल निपटान के बाद पूल में वापस जायेगा? –

+2

गलत उत्तर क्यों चेक किया गया है? यह स्पष्ट रूप से ज्ञात है कि निकट/निपटान वास्तव में कनेक्शन को बंद नहीं करता है, इसे वापस पूल में लाएं। –

1

उपयोग करने का प्रयास करने के लिए सिर्फ एक शॉर्टेंड है। यह है कि क्या आप पोस्ट

Try 
    SqlConnection cn as new system.data.sqlclient.sqlconnection() 
    cn.open 
    '{do a bunch of other stuff with commands and datareaders here} 
    cn.close 'Do I need this? 
Finally 
    cn.Dispose() 
End Try 

निपटान कनेक्शन के मामले में यह यह बंद हो जाएगा में सभी संसाधन सफाई का ख्याल रखना, माना जाता है करने के लिए बराबर कोड है।

4

जबकि एसक्यूएल की डिस्प्ले विधि कनेक्शन बंद कर देती है (अंत में डारिन के अनुसार) आपको कॉल को वहां बंद करने के लिए छोड़ देना चाहिए। इसका कारण यह है कि आप बंद करने के लिए निपटान के अंतर्निहित कार्यान्वयन पर भरोसा करेंगे। बिना किसी बंद के ओपन को देखना उन लोगों के लिए हटाए बिना नया देखने जैसा है जो अप्रबंधित भाषाओं में प्रोग्राम किए गए हैं। यह मेरे लिए एक कोड गंध है।

+0

मैं कोड गंध से सहमत हूं। मैं स्पष्ट रूप से कार्यक्रम नहीं करना चाहता हूं, बिल्कुल नहीं। –

+23

मैं असहमत हूं। यह सिर्फ शोर है। ब्लॉक का उपयोग करने के साथ नया प्रतिमान जानें। – TrueWill

+0

मुझे "कोड गंध" कहने से नफरत है, मुझे नहीं पता कि लोग क्यों सोचते हैं कि लॉल का उपयोग करना ठीक है। मेरी राय में आप गुदा retentive जा रहे हैं, उपयोग कथन बंद ब्रैकेट संसाधन का निपटान उपयोग कथन का उपयोग व्यक्त करता है।आप तर्क दे सकते हैं कि स्पष्ट बंद कॉल कोड फ़ाइल में 3 लाइन जोड़ती है, संभवतः उपयोग कथन ब्लॉक को इतना बड़ा होने का कारण बनता है कि अब आप कोड संपादक में उपयोग ब्लॉक की पहली पंक्ति नहीं देख सकते हैं और यह अधिक असुविधाजनक हो सकता है डेवलपर्स एक स्पष्ट बंद कथन से नाज़ुक संवेदनशीलताएं क्योंकि एक ओपन स्टेटमेंट है –

12

एमएसडीएन के मुताबिक आपको करीबी बयान की आवश्यकता नहीं है।

"निम्न उदाहरण एक एसक्यूएलकनेक्शन बनाता है, इसे खोलता है, इसकी कुछ गुण प्रदर्शित करता है। कनेक्शन ब्लॉक के अंत में स्वचालित रूप से बंद हो जाता है।" - http://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqlconnection.close.aspx

2

"एक प्रयोग ब्लॉक एक कोशिश की तरह व्यवहार करता है ... अंत में निर्माण जिसमें ट्राई ब्लॉक संसाधनों का उपयोग करता है और अंत में ब्लॉक का निपटान करता है। इसके कारण, उपयोग ब्लॉक संसाधनों का निपटान करने की गारंटी देता है, नहीं इससे कोई फर्क नहीं पड़ता कि आप ब्लॉक से कैसे बाहर निकलते हैं। स्टैक ओवरफ्लो एक्सेप्शन को छोड़कर, यह एक अनचाहे अपवाद के मामले में भी सही है। "
https://msdn.microsoft.com/en-us/library/htd05whh.aspx

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