2009-04-13 11 views
63

मैं यहां विरासत कोड के साथ काम कर रहा हूं और SqlDataReader के कई उदाहरण हैं जिन्हें कभी बंद या डिस्पोजेड नहीं किया जाता है। कनेक्शन बंद है लेकिन, मुझे यकीन नहीं है कि पाठक को मैन्युअल रूप से प्रबंधित करना आवश्यक है या नहीं।क्या SQLLataReader को मैन्युअल रूप से बंद करना और निपटाना आवश्यक है?

क्या यह प्रदर्शन में मंदी का कारण बन सकता है?

उत्तर

94

इस तरह रीडर का उपयोग कर से बचने के लिए प्रयास करें:

SqlConnection connection = new SqlConnection("connection string"); 
SqlCommand cmd = new SqlCommand("SELECT * FROM SomeTable", connection); 
SqlDataReader reader = cmd.ExecuteReader(); 
connection.Open(); 
if (reader != null) 
{ 
     while (reader.Read()) 
     { 
       //do something 
     } 
} 
reader.Close(); // <- too easy to forget 
reader.Dispose(); // <- too easy to forget 
connection.Close(); // <- too easy to forget 

इसके बजाय, उन्हें बयान का उपयोग करने में लपेट:

using(SqlConnection connection = new SqlConnection("connection string")) 
{ 

    connection.Open(); 

    using(SqlCommand cmd = new SqlCommand("SELECT * FROM SomeTable", connection)) 
    { 
     using (SqlDataReader reader = cmd.ExecuteReader()) 
     { 
      if (reader != null) 
      { 
       while (reader.Read()) 
       { 
        //do something 
       } 
      } 
     } // reader closed and disposed up here 

    } // command disposed here 

} //connection closed and disposed here 

कथन का उपयोग वस्तु और संसाधनों की मुक्त के सही निपटान सुनिश्चित करेगा।

यदि आप भूल जाते हैं तो आप कचरा कलेक्टर तक सफाई छोड़ रहे हैं, जिसमें कुछ समय लग सकता है।

+21

आपको किसी भी नमूने में .lose() कथन की आवश्यकता नहीं है: इसे डिसस्पेक्ट() कॉल द्वारा नियंत्रित किया जाता है। –

+0

ठीक है, मैंने कोड – Codebrain

+0

में वैकल्पिक के रूप में चिह्नित किया है यह नमूना अंतर्निहित कनेक्शन बंद/डिस्पोजेड नहीं दिखाता है, जो सबसे महत्वपूर्ण बात है। – Joe

9

सुरक्षित होने के लिए, प्रत्येक SqlDataReader ऑब्जेक्ट को using statement में लपेटें।

+0

मेले पर्याप्त। हालांकि, अगर कोई कथन का उपयोग नहीं किया जाता है तो क्या वास्तव में प्रदर्शन में कोई फर्क पड़ता है? –

+0

एक उपयोग कथन डेटा रीडर कोड को रैप करने जैसा ही है ... अंतिम रूप से ... ब्लॉक, अंत में खंड में बंद/निपटान विधि के साथ। असल में, यह सिर्फ "गारंटी देता है" कि वस्तु ठीक से निपटान की जाएगी। – Todd

+0

यह मेरे द्वारा प्रदान किए गए लिंक से सीधे है: "उपयोग करने वाला कथन यह सुनिश्चित करता है कि ऑब्जेक्ट पर विधियों को कॉल करते समय अपवाद तब भी होता है जब कोई अपवाद होता है।" – Kon

4

बस "उपयोग" कथन के साथ अपने SQLDataReader को लपेटें। इससे आपके ज्यादातर मुद्दों का ख्याल रखना चाहिए।

40

ध्यान दें कि एक SqlDataReader निपटाने SqlCommand.ExecuteReader का उपयोग कर instantiated() नहीं पास/अंतर्निहित कनेक्शन निपटाने होंगे।

दो आम पैटर्न हैं। पहले में, पाठक खोला जाता है और बंद कर दिया कनेक्शन के दायरे के भीतर:

using(SqlConnection connection = ...) 
{ 
    connection.Open(); 
    ... 
    using(SqlCommand command = ...) 
    { 
     using(SqlDataReader reader = command.ExecuteReader()) 
     { 
      ... do your stuff ... 
     } // reader is closed/disposed here 
    } // command is closed/disposed here 
} // connection is closed/disposed here 

कभी कभी यह एक डेटा ऐक्सेस विधि एक कनेक्शन खोलने के लिए और एक पाठक लौटने के लिए सुविधाजनक है। इस मामले में यह महत्वपूर्ण है कि लौटा पाठक कमांडबैवियर.क्लोस कनेक्शन का उपयोग करके खोला गया है, ताकि पाठक को बंद/निपटाना अंतर्निहित कनेक्शन बंद कर देगा। पैटर्न इस तरह दिखता है:

और बुला कोड सिर्फ पाठक इस प्रकार निपटान के लिए की जरूरत है:

using(SqlDataReader reader = ExecuteReader(...)) 
{ 
    ... do your stuff ... 
} // reader and connection are closed here. 
+2

SqlCommand ऑब्जेक्ट पर एक बंद() विधि नहीं है। – Dave

+0

दूसरे कोड स्निपेट में जहां विधि एक SqlDataReader देता है कमांड का निपटारा नहीं किया जाता है। क्या यह ठीक है और क्या आदेश को निपटाना ठीक है (इसे एक ब्लॉक में संलग्न करें) और फिर पाठक को वापस कर दें? – alwayslearning

+0

@alwayslearning जो मेरे पास बिल्कुल परिदृश्य है ...... क्या आप स्क्लोकैमैंड को बंद/निपटान कर सकते हैं जब आप कॉलर को SqlDataReader वापस कर रहे हैं? – ganders

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