2013-07-09 6 views
16

ठीक है, तो यह उन तरह के विचारों में से एक है, लेकिन आपके ज्ञान, राय और वर्तमान अभ्यास के आधार पर, निम्नलिखित परिदृश्य को सेट करने का सबसे अच्छा तरीका क्या है?सी # डेटा कनेक्शन सर्वोत्तम अभ्यास?

मैं एक व्यापक डेटा एंट्री एप्लिकेशन बना रहा हूं, और व्यापक रूप से मेरा मतलब है कि मुझे केवल मूलभूत सेटअप मिल गया है जो समग्र कार्यक्रम के लगभग 15-25% को शामिल करता है और मेरे पास लगभग 15 रूप हैं जो आंशिक रूप से सेटअप हैं। (उन्हें अभी भी काम की ज़रूरत है) मैं अपने बैकएंड डेटाबेस के रूप में एसक्यूएल कॉम्पैक्ट 4.0 का उपयोग कर रहा हूं, मुझे वास्तव में अधिक विस्तृत डेटाबेस की आवश्यकता नहीं है क्योंकि मैं एक एमएमओ के डेटा के डेटा को संग्रहीत नहीं कर रहा हूं, और इस पल के लिए यह केवल एक स्थानीय एप्लीकेशन है ।

मुझे इसे एक खिड़की के रूप में प्रदर्शित करने में सक्षम होना पसंद है जो मेनू सिस्टम के आधार पर विभिन्न विभिन्न पृष्ठों में बदलता है, लेकिन मुझे यह नहीं लगता कि यह कैसे होगा पूरा किया गया, इसलिए यदि कोई किसी के बारे में जानता है, तो कृपया मुझे प्रबुद्ध करें।

प्रश्न में परिदृश्य, डेटाबेस से कनेक्ट करने का तरीका है। मैं 2 SQLCE डेटाबेस का उपयोग कर रहा हूं, जो कि सेवाओं और कर्मचारियों पर आधारित निरंतर डेटा संग्रहीत करता है, और दूसरा जो लगातार बदलते डेटा या नए डेटाबेस के आधार पर दर्ज किया गया नया डेटा संग्रहीत करता है। मैंने इसे सेट अप करने के तरीके पर कई अलग-अलग तरीकों को देखा है और वर्तमान में मैं एक का उपयोग कर रहा हूं जिसमें मेरे पास बेसफॉर्म है जो अन्य सभी रूपों से प्राप्त होता है। बेसफॉर्म के भीतर मेरे पास विधियों और चर हैं जो कई रूपों के लिए आम हैं, इस प्रकार दोहराए जा रहे कोड की मात्रा को कम करते हैं।

इसमें दोनों डेटाबेसों के कनेक्शन स्ट्रिंग्स और 2 विधियां शामिल हैं जो उनमें से किसी से कनेक्शन खोलती हैं। इसलिए जैसा:

internal SqlCeConnection dataConn = new SqlCeConnection(@"Data Source = |DataDirectory|\opi_data.sdf"); 
internal SqlCeConnection logConn = new SqlCeConnection(@"Data Source = |DataDirectory|\opi_logs.sdf"); 
internal SqlCeCommand command; 

internal void openDataConnection() // Opens a connection to the data tables 
     { 
      try 
      { 
       if(dataConn.State == ConnectionState.Closed) 
        dataConn.Open(); 
      } 
      catch(SqlCeException ex) 
      { 
       MessageBox.Show(ex.Message, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error); 
      } 
     } 

     internal void openLogConnection() // Opens a connection to the log tables 
     { 
      try 
      { 
       if(logConn.State == ConnectionState.Closed) 
        logConn.Open(); 
      } 
      catch (SqlCeException ex) 
      { 
       MessageBox.Show(ex.Message, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error); 
      } 
     } 

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

क्या फॉर्म लोड होने के तुरंत बाद कनेक्शन खोलना बेहतर है और फिर फॉर्म बंद होने पर इसे बंद करना बेहतर है? मेरे पास ऐसे उदाहरण हैं जहां एक समय में कई रूपरेखा खुले होते हैं और प्रत्येक को शायद डेटाबेस के लिए एक खुले कनेक्शन की आवश्यकता होगी ताकि अगर कोई इसे बंद कर दे तो दूसरों को सही खराब कर दिया जाएगा? या क्या मुझे एप्लिकेशन लॉन्च करने पर दोनों डेटाबेसों के साथ कनेक्शन खोलना चाहिए? किसी भी इनपुट की सराहना की जाएगी। धन्यवाद।

+1

इस प्रश्न को उपयोग वक्तव्य पर देखें http://stackoverflow.com/q/212198/1193596 – Amicable

उत्तर

51

कनेक्शन .NET द्वारा पूल किए जाते हैं, इसलिए उन्हें फिर से बनाना महंगा लागत नहीं है। लंबी अवधि के लिए कनेक्शन खोलना, हालांकि, मुद्दों का कारण बन सकता है।

अधिकांश "सर्वोत्तम प्रथाओं" हमें जितनी जल्दी हो सके कनेक्शन खोलने के लिए बताते हैं (किसी भी एसक्यूएल को निष्पादित करने से ठीक पहले) और जितनी जल्दी हो सके उन्हें बंद कर दें (डेटा के आखिरी बिट को निकालने के ठीक बाद)।

स्वचालित रूप से ऐसा करने का एक कारगर तरीका using बयान के साथ है:

using (SqlConnection conn = new SqlConnection(...)) 
{ 
    using(SqlCommand cmd = new SqlCommand(..., conn)) 
    { 
     conn.Open(); 
     using(DataReader dr = cmd.ExecuteReader()) // or load a DataTable, ExecuteScalar, etc.  
     { 
      ... 
     { 
    } 
} 

इस तरह, संसाधन बंद कर दिया और यहां तक ​​कि अगर एक अपवाद फेंक दिया जाता है का निपटारा कर रहे हैं।

संक्षेप में, जब ऐप खुलता है या प्रत्येक फॉर्म खुलता है तो कनेक्शन खोलना शायद सबसे अच्छा तरीका नहीं है।

+0

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

-10

मुझे लगता है कि एप्लिकेशन लॉन्चिंग पर उन्हें खोलना बेहतर है, क्योंकि आपको अपने डेटाबेस से सामान की आवश्यकता है? मैं इसमें कोई विशेषज्ञ नहीं हूं, यह सिर्फ मेरी राय है ... मैंने कुछ समान अनुप्रयोगों को प्रोग्राम किया और बनाया मुख्य रूप की शुरुआत में कनेक्शन। एकमात्र रूप जहां मैंने एक अलग कनेक्शन बनाया था लॉगिन फॉर्म था।

+7

कृपया सट्टा जवाब पोस्ट न करें, वास्तव में माइक्रोसॉफ्ट द्वारा अनुशंसित सर्वोत्तम अभ्यास हैं। – Mgetz

+0

@Mgetz आप इस अटकलों पर सही हैं और निश्चित रूप से मानक हैं जिन पर मेरा मानना ​​है कि उनका पालन किया जाना चाहिए। उनसे दूर जाने की महत्वपूर्ण बात यह है कि सिर्फ इसलिए कि यह एक मानक है, यह आपके सॉफ्टवेयर सिस्टम के लिए सही नहीं है। अगर यह आपके सिस्टम को बेहतर बनाता है, तो ऐसा कैसे हुआ? इससे एक बेहतर चर्चा होगी। मेरे पास कई एप्लिकेशन हैं जिन्हें मैंने निष्पादित किए जाने तक खुले डेटाबेस कनेक्शन के साथ लिखा है, लेकिन अच्छे कारण के लिए। –

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