2013-09-30 8 views
11

मैं एक एएसपी.NET एप्लिकेशन लिख रहा हूं। मेरे datalayer में एक एसक्यूएल कनेक्शन खोला जा रहा है और पूछताछ से पहले और बाद में बंद कर दिया गया है। SqlConnection एक एकल वर्ग के एक निजी क्षेत्र के रूप में रखा जा रहा है। फिर भीकनेक्शन बंद नहीं था, कनेक्शन का वर्तमान स्थिति खुला है

 conn.Open(); 

     try 
     { 
      // database querying here 
     } 
     finally 
     { 
      conn.Close(); 
     } 

, बहुत दुर्लभ अवसरों मैं अपवाद 'कनेक्शन बंद कर दिया नहीं किया गया मिलता है पर: कक्षा में हर डेटाबेस कॉल एक ही संरचना का उपयोग करता। कनेक्शन की वर्तमान स्थिति खुली है '। समस्या को पुन: उत्पन्न करना संभव नहीं है क्योंकि यह कोड के विभिन्न हिस्सों से बहुत ही कम है। मेरे आवेदन में कुछ थ्रेडिंग शामिल है लेकिन नए थ्रेड भी नए डेटा लेयर क्लासेस और इस प्रकार नई कनेक्शन ऑब्जेक्ट्स बनाते हैं।

मुझे समझ में नहीं आता कि ऊपर दिए गए कोड का उपयोग करके कनेक्शन को खोलने के लिए कैसे संभव है। कनेक्शन को हमेशा खोलने के बाद बंद नहीं किया जाना चाहिए, उपर्युक्त अपवाद के लिए असंभव बनाना?

+1

यहां महत्वपूर्ण बात यह है कि आपकी कॉन ऑब्जेक्ट को तत्काल किया जा रहा है? –

+1

इसके अलावा: 'उपयोग' का उपयोग करने में क्या गलत है? –

+1

बस इसके बजाय एक उपयोग कथन का उपयोग करें? गारंटी बंद और निपटान कनेक्शन है। –

उत्तर

14

यह संभावना है कि try ब्लॉक में एक अपवाद फेंक दिया जा रहा है जिसे आप संभालना नहीं कर रहे हैं। try-finally के लिए एमएसडीएन में यह नोट देखें:

एक हैंडल अपवाद के भीतर, संबंधित अंत ब्लॉक को चलाने की गारंटी है। हालांकि, अगर अपवाद अनचाहे है, तो आखिरकार ब्लॉक का निष्पादन इस बात पर निर्भर करता है कि अपवाद को अनचाहे ऑपरेशन कैसे ट्रिगर किया जाता है।

मैं वैसे भी एक using ब्लॉक में कनेक्शन लपेटकर की सिफारिश करेंगे:

using (SqlConnection connection = new SqlConnection(connectionString)) 
{ 
    //etc... 
} 

वैकल्पिक रूप से, try-finally के लिए कैच ब्लॉक जोड़ें:

conn.Open(); 

    try 
    { 

    } 
    catch 
    { 

    } 
    finally 
    { 
     conn.Close(); 
    } 
+0

धन्यवाद, यह समझाता है कि क्यों conn.Close() कभी-कभी नहीं चलाया जाता है। मैं किसी भी तरह विश्वास में था कि आखिर में {} हमेशा कोई फर्क नहीं पड़ता कि क्या होगा। – user2830395

+0

कोई समस्या नहीं है। यदि यह आपके प्रश्न का उत्तर देता है तो आपको इसे समान समस्याओं का सामना करने वाले अन्य उपयोगकर्ताओं की सहायता करने के उत्तर के रूप में चिह्नित करने पर विचार करना चाहिए। – DGibbs

+0

@ user2830395 आप सही थे, आखिरकार ब्लॉक निष्पादित करता है चाहे कोई अपवाद हो, भले ही कोई अपवाद हो। अगर इस उत्तर में दिए गए कोड ने इस मुद्दे को हल किया है, तो यह एक और कारक के कारण था। – Doug

2

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

using (SqlConnection conn= new SqlConnection(conStr)) 
{ 
    //etc... 
} 

या

1) ओपन कनेक्शन

2) एक्सेस डेटाबेस

3) कनेक्शन

बंद
+1

यदि कनेक्शन के अंदर कोई समस्या थी तो कनेक्शन बंद नहीं होता है ... अंत में बंद होना चाहिए, जिसका अर्थ यह है कि कॉन को प्रयास के बाहर घोषित करने की आवश्यकता है। – D3vy

+0

@ D3vy धन्यवाद, मैंने अपना जवाब संपादित कर लिया है। –

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

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