क्या मुझे निपटाने से पहले किसी SQLConnection को बंद करना होगा?


113

डिस्पोजेबल ऑब्जेक्ट के बारे में मेरे अन्य प्रश्न के अनुसार , क्या हमें एक ब्लॉकिंग ब्लॉक के अंत से पहले बंद () कॉल करना चाहिए?

using (SqlConnection connection = new SqlConnection())
using (SqlCommand command = new SqlCommand())
{
    command.CommandText = "INSERT INTO YourMom (Amount) VALUES (1)";
    command.CommandType = System.Data.CommandType.Text;

    connection.Open();
    command.ExecuteNonQuery();

    // Is this call necessary?
    connection.Close();
}

जवाबों:


107

चूंकि आपके पास एक ब्लॉकिंग ब्लॉक है, SQLCommand की डिस्पोज़ विधि को कॉल किया जाएगा और यह कनेक्शन बंद कर देगा:

// System.Data.SqlClient.SqlConnection.Dispose disassemble
protected override void Dispose(bool disposing)
{
    if (disposing)
    {
        this._userConnectionOptions = null;
        this._poolGroup = null;
        this.Close();
    }
    this.DisposeMe(disposing);
    base.Dispose(disposing);
}

1
यह करता है ।_पूलग्रुप = अशक्त; इसका मतलब है कि कनेक्शन वापस कनेक्शन पूल में नहीं मिल रहा है? तो मेरे पास n-1 कनेक्शन होगा?
रॉय नमिर

25

SqlConnection के disassembly का उपयोग करने से नेट परावर्तक :

protected override void Dispose(bool disposing)
{
    if (disposing)
    {
        this._userConnectionOptions = null;
        this._poolGroup = null;
        this.Close();
    }

    this.DisposeMe(disposing);
    base.Dispose(disposing);
}

यह निपटान के अंदर बंद () कहता है ()


1
@statenjason: क्या आप यह कह सकते हैं कि आप disassembler line .net रिफ्लेक्टर का उपयोग करके कैसे लाभ उठा सकते हैं?
ओडीसह

3
@odiseh बस .NET रिफ्लेक्टर डाउनलोड करें, रिफ्लेक्टर। exe चलाएँ, और आप कोई भी .net DLL (मानक पुस्तकालय सहित) खोल सकते हैं। यह आपको विज़ुअल स्टूडियो के ऑब्जेक्ट ब्राउज़र के समान एक ट्री संरचना प्रदान करता है, हालाँकि, आप किसी भी वर्ग या विधि पर राइट क्लिक कर सकते हैं और "डिसएम्बल" पर क्लिक कर सकते हैं, फिर यह आपके लिए C # या VB में स्रोत को लौटा देगा, जिसे आपने चुना है विकल्प।
स्टेटनजसन

20

उपयोग करने वाला कीवर्ड कनेक्शन को सही ढंग से बंद कर देगा इसलिए बंद करने के लिए अतिरिक्त कॉल की आवश्यकता नहीं है।

SQL सर्वर कनेक्शन पूलिंग पर MSDN आलेख से :

"हम दृढ़ता से अनुशंसा करते हैं कि आप हमेशा कनेक्शन को बंद कर दें जब आप इसका उपयोग कर समाप्त कर लें ताकि कनेक्शन पूल में वापस आ जाए। आप कनेक्शन ऑब्जेक्ट के क्लोज़ या डिस्पोज़ करने के तरीकों का उपयोग करके, या सभी कनेक्शनों को खोलकर ऐसा कर सकते हैं। C # में स्टेटमेंट का उपयोग करना

.NET रिफ्लेक्टर का उपयोग करके SqlConnection.Dispose का वास्तविक कार्यान्वयन निम्नानुसार है:

// System.Data.SqlClient.SqlConnection.Dispose disassemble
protected override void Dispose(bool disposing)
{
    if (disposing)
    {
        this._userConnectionOptions = null;
        this._poolGroup = null;
        this.Close();
    }
    this.DisposeMe(disposing);
    base.Dispose(disposing);
}

1
MSDN लिंक के लिए +1 - मुझे अगले लड़के की तरह रिफ्लेक्टर \ ILspy पसंद है, लेकिन डॉक्स वे हैं जहां मैं उनके जवाब खोजने के लिए जाना चाहता हूं।
mlhDev

5

रिफ्लेक्टर का उपयोग करना , आप देख सकते हैं कि वास्तव में कॉल Disposeकरने की विधि है ;SqlConnectionClose()

protected override void Dispose(bool disposing)
{
    if (disposing)
    {
        this._userConnectionOptions = null;
        this._poolGroup = null;
        this.Close();
    }
    this.DisposeMe(disposing);
    base.Dispose(disposing);
}


3

नहीं, Dispose()वैसे भी आपके लिए यूज़िंग ब्लॉक कॉल है, इसलिए कॉल करने की कोई आवश्यकता नहीं है Close()


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

6
नहीं है कि दूसरे तरीके के आसपास - Dispose()कॉल Close(), इसके विपरीत नहीं?
टाउन

1
यह दोनों, आमतौर पर है। किसी कारण के लिए उन्होंने लागू करने का फैसला किया कि क्लोज़ डिस्पोज़ को भी बुलाएगा। SqlConnection के लिए यह कोई बड़ी बात नहीं है, लेकिन अगर आप बंद करते हैं और फिर उन्हें डिस्पोज करते हैं तो स्ट्रीमवियर्स एक अपवाद को फेंक देगा। मेरा अनुमान है कि वे उस व्यवहार को केवल इसलिए नहीं बदलेंगे क्योंकि यह वही है जो लोग अब उम्मीद करने लगे हैं।

2

नहीं, डिस्पोजल कॉल करने से पहले कनेक्शन बंद करना आवश्यक नहीं है।

कुछ ऑब्जेक्ट्स, (SQLConnections की तरह) का उपयोग कॉल को बंद करने के लिए किया जा सकता है, लेकिन डिस्पोजल कॉल करने के बाद नहीं। अन्य वस्तुओं को बंद करने के लिए कॉलिंग डिस्पोज के समान है। (मैन्युअल रूप से काम करना और धाराएं मुझे लगता है कि इस तरह से व्यवहार करें)


1

नहीं, SqlConnection वर्ग को IDisposable से विरासत में मिला है, और जब उपयोग के अंत (कनेक्शन ऑब्जेक्ट के लिए) का सामना करना पड़ता है, तो यह स्वचालित रूप से SqlConnection वर्ग पर Dispose कहता है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.