2013-09-03 9 views
15

का उपयोग कर अंदर अपने सभी उत्तर उपयोगी थे। उन सभी का धन्यवाद जिन्होंने मेरे प्रश्न का उत्तर देने पर प्रयास किया।SqlConnection.Close() कथन

public void InsertMember(Member member) 
    { 
     string INSERT = "INSERT INTO Members (Name, Surname, EntryDate) VALUES (@Name, @Surname, @EntryDate)"; 

     using (sqlConnection = new SqlConnection(sqlConnectionString_WORK)) 
     { 
      sqlConnection.Open(); 

      using (SqlCommand sqlCommand = new SqlCommand(INSERT, sqlConnection)) 
      { 
       sqlCommand.Parameters.Add("@Name", SqlDbType.VarChar).Value = member.Name; 
       sqlCommand.Parameters.Add("@Surname", SqlDbType.VarChar).Value = member.Surname; 
       sqlCommand.Parameters.Add("@EntryDate", SqlDbType.Date).Value = member.EntryDate; 

       sqlCommand.ExecuteNonQuery(); 
      } 
     } 
    } 

यह गलत है अगर मैं इसे निपटाने से पहले sqlConnection.Close(); न जोड़ें: चीयर्स :)

मैं इस कोड का उपयोग कर रहा हूँ? मेरा मतलब है ... यह कोई त्रुटि नहीं दिखा रहा है, कोई समस्या नहीं है ... क्या इसे पहले बंद करना बेहतर है? यदि हां, क्यों?

+2

बयान का उपयोग करके एक सामान्य try finally block में बदल दिया जाएगा होगा 'Dispose' भी एक अपवाद के मामले में कनेक्शन, इसलिए आपको वास्तव में 'बंद' कॉल की आवश्यकता नहीं है – V4Vendetta

उत्तर

21

Close or Disposeusing ब्लॉक की आवश्यकता नहीं है आपके लिए यह ख्याल रखेगा।

MSDN से कहा गया है:

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

private static void OpenSqlConnection(string connectionString) 
{ 
    using (SqlConnection connection = new SqlConnection(connectionString)) 
    { 
     connection.Open(); 
     Console.WriteLine("ServerVersion: {0}", connection.ServerVersion); 
     Console.WriteLine("State: {0}", connection.State); 
    } 
} 
+0

यह 'बंद करें()' के बारे में है, 'निपटान नहीं करें)' :) – Matten

+0

@ मैटन - धन्यवाद - बस संपादित किया गया। –

+1

यदि कोड में कनेक्शन है तो यह ठीक है। बंद करें(); अपने दूसरे अंतिम घुंघराले ब्रेस '}' से ठीक पहले? क्या यह एक अपवाद फेंक देगा जब उपयोग ब्लॉक ब्लॉक से पहले से बंद कनेक्शन को बंद करने का प्रयास करता है? – variable

1

नहीं, यह गलत नहीं है। SqlConnection को ब्लॉक का उपयोग करके और निपटान विधि को कॉल करने के बाद कनेक्शन बंद कर देगा। SqlConnection.Dispose() SqlConnection.Close() विधि के बराबर।

एमएसडीएन से: यदि एसक्यूएलकनेक्शन गुंजाइश से बाहर हो जाता है, तो यह बंद नहीं होगा। इसलिए, आपको बंद या निपटान को कॉल करके कनेक्शन को स्पष्ट रूप से बंद करना होगा। बंद करें और निपटान कार्यात्मक रूप से समकक्ष हैं।

1

आप Using का उपयोग कर रहे हैं जो आपके लिए ऑब्जेक्ट Dispose() होगा।

यदि आप Using कथन के बाहर कनेक्शन लेते हैं, तो हाँ - समाप्त होने पर आपको कनेक्शन बंद करना होगा।

1

MSDN documentation for the Close method के अनुसार:

आप स्पष्ट रूप से बुला बंद या निपटान द्वारा कनेक्शन बंद करना होगा। बंद और का निपटान कार्यात्मक रूप से समकक्ष हैं।

इसलिए, बुला Dispose (परोक्ष हां, तो भी, using का प्रयोग करके), अपने ठिकानों को कवर किया जाएगा क्योंकि यह थे।

यह भी मुझे लगता है कि हालांकि आपके मामले के लिए विशिष्ट नहीं है कि Close हमेशा प्रभावी रूप से जब बात एक using बयान में लपेटा जाता है बुलाया जाएगा ध्यान देने योग्य है, - जो मामले इसे छोड़ा नहीं जा सकता है किया जाना चाहिए और एक अपवाद उचित try/catch/finally हैंडलिंग के बिना होता है।

+0

उदाहरण में यह कहता है: निम्न उदाहरण एक एसक्यूएलकनेक्शन बनाता है, इसे खोलता है, इसकी कुछ गुण प्रदर्शित करता है। उपयोग ब्लॉक के अंत में कनेक्शन स्वचालित रूप से बंद हो जाता है। –

+0

@ डेरेन डेविस निश्चित रूप से। यह विवरण के मुकाबले और भी स्पष्ट है। –

1

क्या यह गलत है अगर मैं sqlConnection नहीं जोड़ता।बंद करे(); निपटाने यह

नहीं से पहले, यह जब तक आप Using के भीतर अपने कनेक्शन का उपयोग कर रहे हैं नहीं है। जब आप उपयोग स्कोप छोड़ देंगे, Dispose एसक्यूएल कनेक्शन के लिए बुलाया जाएगा। जो मौजूदा कनेक्शन को बंद कर देगा और सभी संसाधनों को भी मुक्त कर देगा।

2

उपयोग कथन अंततः एक कोशिश है और आपके मामले में अंतिम ब्लॉक में connection.Dispose() कॉल होगा। तो आपको वास्तव में वहां एक स्वतंत्र connection.Close() कथन की आवश्यकता नहीं है।

लाभ यह है कि अंततः ब्लॉक हमेशा चलने के बाद से अपवाद के मामले में निपटान सुनिश्चित करता है।

try 
{ 
sqlConnection.Open(); 
// .... 
} 
finally 
{ 
if(sqlConnection != null) 
     sqlConnection.Dispose(); 
} 
0

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

इस कारण का कारण कचरा कलेक्टन कैसे काम करता है। लंबी कहानी छोटी - यह वस्तुओं का नक्शा बनाता है और उन वस्तुओं का कोई सक्रिय संदर्भ नहीं होने पर वास्तव में उनका निपटान करता है।

3

using statement ensures that Dispose is called भले ही कोई अपवाद तब होता है जब आप ऑब्जेक्ट पर विधियों को कॉल कर रहे हों। You can achieve the same result by putting the object inside a try block and then calling Dispose in a finally block; वास्तव में, इस प्रकार उपयोग कथन संकलक द्वारा अनुवादित है। MSDN

तो अंततः अपने कोड लाइन

using (sqlConnection = new SqlConnection(sqlConnectionString_WORK)) 

संकलक बुला IDisposable object in the finally