2009-09-14 19 views
9

मेरे पास निम्न ado.net कोड है, यदि मैं पहले से ही का उपयोग का उपयोग करके अपने डीबीसीओएमएंड को लपेटने के लिए करता हूं, तो क्या मुझे नीचे कनेक्शन को बंद करना होगा?dbCommand.Close() कनेक्शन को बंद कर देगा?

धन्यवाद,

 public static void ExecuteSQL(int Id) 
     { 
      Database db; 
      const string sqlCommand = "Stored Procedure Name"; 
      try 
      { 
       db = DatabaseFactory.CreateDatabase(); 
       using (DbCommand dbCommand = db.GetStoredProcCommand(sqlCommand)) 
       { 
        db.AddInParameter(dbCommand, "p_Id", DbType.Int32, Id); 
        db.ExecuteNonQuery(dbCommand); 
**//do I have to close connection explicitely here??** 
        if (dbCommand.Connection.State != ConnectionState.Closed) 
        { 
         dbCommand.Connection.Close(); 
        } 
        dbCommand.Connection.Dispose(); 
       } 
      } 
      catch (Exception ex) 
      { 
       Logger.Log.Error(ex.StackTrace, ex); 
       throw; 
      } 
     } 

उत्तर

4

हाँ, अगर तुम सब using ब्लॉक में लिपटे है DbCommand है, तो आप होगा स्पष्ट DbConnection बंद करने के लिए, के रूप में आप वर्तमान में अपने कोड में करते हैं। हालांकि, यह पर्याप्त है, बस Dispose पर कॉल करने के लिए। आपको Close और Dispose दोनों को कॉल करने की आवश्यकता नहीं है।

+0

मुझे विश्वास है कि इस मामले में @ सत्यया सही है और आपका जवाब वास्तव में गलत है। – Coops

+0

@CodeBlend: उस स्थिति में जहां कोई एंटरप्राइज़ लाइब्रेरी का उपयोग कर रहा है, तो हाँ, उसका जवाब सही है। हालांकि, कोड 'डेटाबेस' जैसे संदर्भ वर्ग करता है, जबकि प्रश्न की सामग्री और टैग EntLib का संदर्भ नहीं देते हैं। नतीजतन, यदि लोग पूछे जाने वाले प्रश्न का उत्तर खोज रहे हैं, तो यह अभी भी सही होगा। –

-1

नहीं, आप ऐसा नहीं करते।

एक बार उपयोग ब्लॉक का अंत मारा जाता है, तो निपटान आपके लिए बुलाया जाता है।

+2

मुझे नहीं पता कि यह क्यों ऊपर उठाया जा रहा है, क्योंकि यह सिर्फ सादा गलत है। आपको बिल्कुल कनेक्शन बंद करना होगा। यह प्रश्न ** कनेक्शन ** का निपटान करने के बारे में है, ** कमांड ** नहीं। अकेले कमांड का उपयोग करके ऐसा नहीं होता है। –

+0

अपने कोड में टिप्पणी के आधार पर और तथ्य यह है कि वह स्पष्ट रूप से dbCommand.Connection.Close और dbCommand.Connection.Dispose() को कॉल कर रहा है, हालांकि मैं पूछ रहा था कि क्या वह आवश्यक था क्योंकि वह पहले से ही एक ब्लॉक में कमांड को लपेट रहा था। अगर वह पूछ रहा था कि क्या उसे अभी भी डीबी की तरह कुछ कॉल करने की आवश्यकता है। बंद करें और डीबी। मान लीजिए तो आप 100% सही हैं। मैंने अभी नहीं सोचा था कि उसका सवाल यही था। – cptScarlet

+0

"अगर मैं पहले से ही अपने डीबीसीओएमएंड को लपेटने के लिए उपयोग कर रहा हूं, तो क्या मुझे नीचे * कनेक्शन के नीचे * बंद करना होगा" यह स्पष्ट रूप से स्पष्ट रूप से शब्द लगता है। –

2

http://www.willydev.net/descargas/WillyDev_EntLib_TestGuide.pdf

आवेदन ब्लॉक डेटाबेस कनेक्शन के बाद यह उन लोगों के साथ समाप्त हो गया है बंद कर देता है। उदाहरण के लिए, ExecuteNonQuery विधि के कार्यान्वयन में एक उपयोग कथन शामिल है। उपयोग कथन संसाधन प्राप्त करता है, एक बयान निष्पादित करता है, और संसाधनों का निपटान करता है। इस मामले में, संसाधन डेटाबेस कनेक्शन है। ExecuteReader विधि के मामले में, अनुप्रयोग ब्लॉक कमांड-व्यवहार का उपयोग करता है। पाठक बंद होने के बाद कनेक्शन को बंद करने के लिए क्लोजक कनेक्शन विधि।

+0

तो प्रतिक्रिया 'यहां' के रूप में चिह्नित प्रतिक्रिया पूरी तरह से गलत है? – Coops

1

यह पोस्ट पुराना है, लेकिन मैं यह कहने का उत्तर दे रहा हूं कि मुझे यकीन है कि कनेक्शन बंद हो गया है यदि हम एंटरप्राइज़ लाइब्रेरी के साथ इस ब्लॉक का उपयोग कर रहे हैं (कोड ब्लॉक में कक्षाएं और विधि नाम मुझे इस बारे में सोचते हैं)। वह व्यक्ति जिसने प्रश्न उठाया, और किसने उत्तर दिया कि स्पष्ट रूप से यह विचार करना चाहिए कि क्या हम EnterbriseLibrary के बारे में बात कर रहे हैं या नहीं। मैंने अंततः ब्लॉक के साथ परीक्षण किया, और हाँ, कनेक्शन डीबीकॉमैंड के साथ उपयोग ब्लॉक के बाद स्वचालित रूप से बंद हो गया है।

+0

क्या आप कोड पोस्ट कर सकते हैं, मुझे यह साबित करने के लिए एक उदाहरण चाहिए कि आप जो कह रहे हैं वह सही है हालांकि मुझे लगता है कि यह है – Coops

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