2010-04-21 7 views
14

क्या कोई अपवाद होने पर निम्न कोड कनेक्शन खोलता है?अपवाद की स्थिति में डेटाबेस कनेक्शन को बंद करने का सही तरीका

मैं एक माइक्रोसॉफ्ट एसक्यूएल कॉम्पैक्ट संस्करण डेटाबेस का उपयोग कर रहा हूं।

try 
{ 
    SqlCeConnection conn = new SqlCeConnection(ConnectionString); 

    conn.Open(); 

    using (SqlCeCommand cmd = 
     new SqlCeCommand("SELECT stuff FROM SomeTable", conn)) 
    { 
     // do some stuff 
    } 

    conn.Close(); 
} 
catch (Exception ex) 
{ 
    ExceptionManager.HandleException(ex); 
} 

निश्चित रूप से एक बेहतर तरीका, कोशिश से पहले एक कनेक्शन वस्तु घोषित कोशिश ब्लॉक के अंदर एक संबंध स्थापित है और एक अंत में ब्लॉक में बंद करने के लिए हो सकता है? क्योंकि कनेक्शन हमेशा अंत में बंद किया जाना चाहिए

SqlCeConnection conn = null; 
try 
{ 
    conn = new SqlCeConnection(ConnectionString); 

    conn.Open(); 

    using (SqlCeCommand cmd = 
     new SqlCeCommand("SELECT stuff FROM SomeTable", conn)) 
    { 
     // do some stuff 
    } 
} 
catch (Exception ex) 
{ 
    ExceptionManager.HandleException(ex); 
} 
finally 
{ 
    if(conn != null) conn.Close(); 
} 

उत्तर

4
try 
catch 
finally 

, इस संभाल करने के लिए उचित तरीका है। लेकिन आपको न केवल conn != null की जांच करनी चाहिए, लेकिन conn राज्य Closed नहीं है।

8

उपयोग Using

using(SqlConnection conn = new SqlConnection()) 
{ 
//put all your code here. 
} 
0

क्यों कनेक्शन के साथ ही आदेश के आसपास का उपयोग कर एक का उपयोग नहीं?

27

using ब्लॉक की सहायता से आप अपने कोड में SqlCeCommand को संभालने का तरीका, आप SqlCeConnection के लिए ऐसा ही कर सकते हैं।

SqlCeConnection conn; 
using (conn = new SqlCeConnection(ConnectionString)) 
{ 
    conn.Open(); 
    using (SqlCeCommand cmd = 
     new SqlCeCommand("SELECT stuff FROM SomeTable", conn)) 
    { 
    // do some stuff 
    } 
} 

ध्यान दें: आप कक्षाओं कि IDisposable को लागू करने के लिए एक using ब्लॉक का उपयोग कर सकते हैं।

संपादित करें: http://msdn.microsoft.com/en-us/library/system.data.sqlserverce.sqlceconnection%28VS.80%29.aspx

+0

मैं अभी भी इसके चारों ओर अपने सिर को लपेट नहीं सकता। रेफरी से: "यदि एसक्यूएलसीकनेक्शन गुंजाइश से बाहर हो जाता है, तो यह बंद नहीं होता है। आपको बंद या निपटान को कॉल करके कनेक्शन को स्पष्ट रूप से बंद करना होगा।" अपने पहले उदाहरण में आप "कनेक्शन को स्पष्ट रूप से बंद नहीं करते"। –

+1

'उपयोग' कथन का उपयोग करते समय, यह उपयोग की जा रही वस्तु पर 'निपटान' विधि को कॉल करता है, जो बदले में 'SqlCeConnection' के मामले में 'बंद करें' विधि को कॉल करेगा। 'SqlCeConnection' पर 'निपटान'' कहा जाता है, यह देखने के लिए आईएलएसपी जैसे टूल का उपयोग करें कि कौन सा कोड निष्पादित किया जाता है। प्रलेखन देखें [यहां] (http://msdn.microsoft.com/en-us/library/bb300654%28v=vs.100%29.aspx)। – shahkalpesh

0

आप using बयान है, जो बाधाओं http://davidhayden.com/blog/dave/archive/2005/01/13/773.aspx

+0

MySQL .NET कनेक्टर और अन्य जैसे अन्य कनेक्टर के बारे में क्या। @Mamoo – Adrian

+0

किसी भी कनेक्टर, जैसे Mysql.net प्रदाता * चाहिए * (और संभवतः) कनेक्शन और कमांड जैसी वस्तुओं पर IDISposable लागू करना चाहिए, इसलिए "उपयोग" भी हो सकता है और वहां भी होना चाहिए। फ़ाइल एक्सेस के लिए या किसी भी समय एक ऑब्जेक्ट अप्रबंधित कोड/संसाधनों में पार हो जाता है – plyawn

0

आप मार्ग के बाद प्रयास करने के बिना कनेक्शन बंद करने हैंडल का उपयोग करना चाहिए: यह एक ही रूप में

try 
{ 
    conn = new SqlCeConnection(ConnectionString); 
    conn.Open(); 

    SqlCeCommand cmd = conn.CreateCommand(); 
    cmd.CommandText = "..."; 

    cmd.ExecuteNonQuery(); 
} 
finally 
{ 
    conn.Close(); 
} 

रेफरी है। क्योंकि अंत में कनेक्शन बंद करें

try 
{ 
    SqlCeConnection conn = new SqlCeConnection(ConnectionString); 

    conn.Open(); 

    using (SqlCeCommand cmd = 
     new SqlCeCommand("SELECT stuff FROM SomeTable", conn)) 
    { 
     // do some stuff 
    } 
} 
catch (Exception ex) 
{ 

} 
finally 
{ 
\\close connection here 
} 
संबंधित मुद्दे

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