2012-04-30 19 views
7

मैं यहाँ http://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqlconnection.open.aspx 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); 
    } 
} 

मेरा प्रश्न है ... साइट भी लिखते हैं कि .Open() InvalidOperationExceptions और SqlExceptions फेंक कर सकते हैं, लेकिन इस उदाहरण नहीं करता है ऐसा लगता है कि यह उन्हें संभालता है।

क्या यह सिर्फ इसलिए है क्योंकि वे कोड के साथ संक्षिप्त थे, या क्या कोई कारण है कि वे यहां संभालने योग्य नहीं हैं? क्या वे शायद किसी भी तरह से निर्माण का उपयोग करके संभाले जाते हैं?

+0

'ओपेन() 'कनेक्शन स्ट्रिंग अमान्य होने पर अपवाद फेंक देगा,' SqlConnection' ऑब्जेक्ट शून्य या खाली है या सर्वर (या स्थानीय डेटाबेस) में कोई कनेक्शन नहीं बनाया जा सकता है। उस स्थिति में, वे मानते हैं कि कनेक्शन स्ट्रिंग मान्य है और उपयोग करने वाले कथन का आश्वासन है कि कनेक्शन शून्य नहीं है। – DangerMonkey

उत्तर

9

क्या यह सिर्फ इसलिए है क्योंकि वे कोड के साथ संक्षिप्त थे, या कोई कारण है कि वे यहां हैंडलिंग के लायक नहीं हैं? क्या वे संभवतः द्वारा किसी भी तरह से निर्माण का उपयोग कर संभाले जाते हैं?

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

+0

सभी को धन्यवाद, जो इसे बहुत साफ करता है। मैं एक सी ++ बैकगोरंड से आ रहा हूं, इसलिए मैं इन चीजों में से कुछ को दोबारा जांचना चाहता हूं ताकि वे यह सुनिश्चित कर सकें कि वे मुझसे ज्यादा नहीं कर रहे हैं :) –

3

यह निर्भर करता है कि यदि आप इन अपवादों को फँसाने पर कुछ भी कर सकते हैं।

यदि नहीं - तो आम तौर पर अपवादों को ढेर तक बुलबुला करने के लिए सबसे अच्छा अभ्यास माना जाता है, जब तक कि वे एक बिंदु तक पहुंच जाएं, जहां उन्हें एक सार्थक तरीके से संभाला जा सकता है (जो कि वेब के मामले में 500 त्रुटि दर्ज कर रहा है) -एप)

4

एमएसडीएन उदाहरण सर्वोत्तम उदाहरणों को पढ़ाने के लिए आसान उदाहरण पढ़ने के लिए लिखे गए हैं। यही कारण है कि लोगों को समझने के बिना कोड कॉपी/पेस्ट नहीं करना चाहिए।

प्रति MSDN

कथन का उपयोग सही तरह से वस्तु पर निपटान प्रणाली को बुलाती है, और (जब आप इसका इस्तेमाल पहले दिखाया गया है) यह भी कारण बनता है वस्तु ही क्षेत्र से बाहर जाने के लिए जैसे ही निपटान कहा जाता है।

यह खुला कनेक्शन बंद कर देगा (अंत में उपयोग के माध्यम से)। यह अपवाद को फेंक दिया नहीं जाएगा। यह कोशिश/अंत में संलग्न बयान लपेटकर ऐसा करता है। कोई पकड़ नहीं है

+0

सहमत हुए। उदाहरण कोड में सर्वोत्तम प्रथाओं के साथ समस्या का एक हिस्सा यह है कि नए लोगों के लिए यह पता लगाना बहुत मुश्किल है कि क्या हो रहा है। – NotMe

2

इन मामलों को संभाला जा रहा है।

using कथन का एक उचित निपटान पैटर्न में अनुवाद किया जाता है जो अपवादों के मामलों में निपटान भी संभालता है।

इस मामले में, यदि कोई अपवाद फेंक दिया गया है, तो कनेक्शन का निपटारा किया जाएगा।

अपवाद स्वयं ही बबल हो जाएगा।

विवरण के लिए एमएसडीएन पर using Statement देखें।

+0

क्या आप इसे मेरे लिए थोड़ा और समझा सकते हैं या एक लिंक दे सकते हैं जिसे मैं पढ़ सकता हूं? –

+1

वे * हैंडल * नहीं किया जा रहा है। –

+1

@ केंडलफ्रे - अपवादों के बावजूद निपटान के मामलों को संभाला जाएगा। जवाब दिया जवाब। – Oded

0

उपयोग कथन यह सुनिश्चित करता है कि ऑब्जेक्ट पर विधियों को कॉल करते समय अपवाद होता है भले ही निपटान किया जाता है। कोशिश/पकड़ महंगा है।कोशिश/पकड़ संकलक अनुकूलन को प्रभावित कर सकता है और कौन सा प्रोग्रामर शून्य के लिए जांच के रूप में सरल कुछ करने पर कोशिश/पकड़ का उपयोग करेगा। यह सिर्फ बुरा अभ्यास है। एक अपवाद पकड़ना हमेशा एक साधारण जांच करने से धीमा होगा। मैं उनका उपयोग नहीं कर रहा हूं लेकिन रक्षात्मक प्रोग्रामिंग के स्थान पर उनका उपयोग नहीं करता हूं।

इसके अलावा, कोड देख आदेश केवल कहा जा सकता है "खुला" वहाँ है अगर कोई चिंता नहीं connection..so एक वैध ....

"का उपयोग करना" एक कोशिश के अंदर वस्तु डाल रूप में ही है अवरुद्ध करें और फिर आखिरकार ब्लॉक में निपटान करें।

आप अभी भी try..catch शामिल किसी भी विशिष्ट अपवाद को संभालने के लिए की जरूरत है ..

+0

-1: 'उपयोग' से एप्लिकेशन को रोकने के लिए कुछ भी नहीं है दुर्घटनाग्रस्त। –

+0

धन्यवाद जॉन इसे स्पष्ट करने के लिए .... – Charls

0

यह नमूना है, जबकि तकनीकी रूप से सही भ्रामक है,। एक असली दुनिया में आवेदन इस नमूना "जैसा है" का कोई मूल्य नहीं है।
वे एसक्यूएलकनेक्शन को कॉलिंग कोड पर भी वापस नहीं करते हैं।
तो "जैसा कि आपने कहा था" वे कोड के साथ संक्षिप्त थे। "

एक असली दुनिया परिदृश्य में आप इस

private static SqlConnection OpenSqlConnection(string connectionString) 
{ 
    SqlConnection connection = new SqlConnection(connectionString) 
    connection.Open(); 
    return connection;  
} 

की तरह एक विधि है और उसके बाद (यद्यपि कोई ज्यादा हासिल करने के लिए) अपने कोड में इसका इस्तेमाल

using(SqlConnection cnn = OpenSqlConnection(connectionString)) 
{ 
    // Do your work here 
    .... 
} 
निश्चित रूप से

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

+0

आपका क्या मतलब है, "आपको कोई सुराग नहीं मिला"? आपको एक अपवाद मिलता है, जो एक बहुत बड़ा "सुराग" है। –

+0

@ जॉन सैंडर्स मैं इस बारे में सोच रहा था। यदि 'उपयोग' एक कोशिश/आखिरकार ब्लॉक की तरह है, तो क्या होता है अगर उपयोग ब्लॉक के अंदर हमें अपवाद मिलता है?क्या यह ब्लॉक के बाहर बुलबुले हो जाएगा और हम नोटिस ले सकते हैं या आखिरकार बंद होने वाली ब्रेस द्वारा इसे 'खाया' जाएगा? – Steve

+0

बस पाया [यह] (http://stackoverflow.com/questions/911626/catch-exceptions-within-a-using-block-vs-outside-the-using-block-which-is-bett), अब पढ़ना बेहतर समझने के लिए – Steve

1
using (SqlConnection connection = new SqlConnection(connectionString)) 
    { 

    } 

"का उपयोग" बस सुनिश्चित करने के लिए है

try 
{ 

    SqlConnection connection = new SqlConnection(connectionString) 
} 
finally 
{ 
    connection.Dispose(); 
} 

के बराबर है उस वस्तु पर निपटाने() विधि कहा जाता हो जाता है (इस मामले में यकीन है कि कनेक्शन कनेक्शन के लिए वापस आ जाता है बनाने के लिए पूल)। "का उपयोग" पकड़ को बदलने के लिए कभी नहीं था।

परियोजनाओं पर मैंने काम किया है, आम तौर पर हमारे पास अंततः बहुत कोशिश है। इसे लॉग करने के लिए केवल उच्चतम स्तर पर कैच का उपयोग किया जाता है। त्रुटियों को फेंकने के लिए एक कारण पकड़ का उपयोग नहीं किया जाना चाहिए (जैसा कि इसे लॉगिंग करने के विपरीत) यह है कि पकड़ बहुत संसाधन गहन है।

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