2009-02-27 13 views
7

के लिए यह StackOverflow पर मेरी पहली पोस्ट है, इसलिए कोमल हो कृपया ...ADO.NET उत्तम आचरण कनेक्शन और DataAdaptor वस्तु स्कोप

मैं ADO.NET के लिए वस्तु गुंजाइश के बारे में कुछ सवाल हैं।

जब मैं एक डेटाबेस से कनेक्ट, मैं आम तौर पर कोड इस तरह का उपयोग करें:

OleDbConnection conn = new OleDbConnection("my_connection_string"); 
conn.Open(); 
OleDbDataAdapter adapter = new OleDbDataAdapter("SELECT * from Employees", conn); 
OleDbCommandBuilder cb = new OleDbCommandBuilder(adapter); 
DataTable dt = new DataTable(); 
adapter.Fill(dt); 
conn.Close(); 
conn.Dispose(); 

कहते हैं कि मैं एक ग्रिड नियंत्रण के परिणामस्वरूप DataTable बाँध और मेरे उन ग्रिड सामग्री संपादित करने की अनुमति दें।

adapter.Update(dt); 

यहाँ मेरी प्रश्न हैं:: अब, जब मेरे उपयोगकर्ताओं को एक सहेजें बटन दबाते हैं, तो मैं इस कोड कॉल करने की आवश्यकता

1) मैं एडाप्टर उद्देश्य यह है कि मैं बनाया बनाए रखने की जरूरत है जब मैं मूल रूप से भरा हुआ डेटाटेबल, या मैं अद्यतन करने के लिए सहेजें बटन क्लिक ईवेंट में एक और एडाप्टर ऑब्जेक्ट बना सकता हूं?

2) यदि मुझे मूल एडाप्टर ऑब्जेक्ट को बनाए रखने की आवश्यकता है, तो क्या मुझे कनेक्शन ऑब्जेक्ट को उपलब्ध और खोलने की भी आवश्यकता है?

मैं ADO.NET के डिस्कनेक्टेड मॉडल को समझता हूं - डेटाबेस को अपडेट करने का समय होने पर मैं ऑब्जेक्ट स्कोप पर उलझन में हूं। अगर कोई मुझे इस परिदृश्य के लिए सर्वोत्तम प्रथाओं पर कुछ पॉइंटर्स दे सकता है, तो मैं इसकी सराहना करता हूं!

अग्रिम धन्यवाद ...

उत्तर

3

1) आप एक ही DataAdapter की जरूरत नहीं है, लेकिन अगर आप एक नया बना यह अपने आधार के रूप में एक ही क्वेरी का उपयोग करना चाहिए।

2) कनेक्शन बंद होने पर डेटा एडाप्टर अपना कनेक्शन खोल देगा। उस स्थिति में यह पूरा होने के बाद कनेक्शन बंद कर देगा। यदि कनेक्शन पहले से ही खुला है तो यह कनेक्शन पूरा होने के बाद भी खुल जाएगा।

आम तौर पर आप अपने उदाहरण के रूप में काम करेंगे। एक Conneciton और डेटा एडाप्टर बनाएँ, डेटाटेबल भरें और बाद में कनेक्शन और डेटा एडाप्टर का निपटान करें।

दो अपने कोड के लिए टिप्पणी:

  • चूंकि आप केवल कुछ चुनिंदा लोगों करना CommandBuilder यहां जरूरत नहीं है। कमांड बिल्डर केवल तभी जरूरी है जब आप स्वचालित रूप से सम्मिलित करें, अद्यतन करें या हटाएं कथन बनाना चाहते हैं। उस स्थिति में आपको CommandBuilder से मैन्युअल रूप से DataAdapter पर InsertCommand, UpdateCommand या DeleteCommand सेट करने की आवश्यकता है।
  • दूसरा। कॉल करने के बजाए मैन्युअल रूप से निपटान करने के लिए आपको उपयोग खंड का उपयोग करना चाहिए। यह सुनिश्चित करता है कि अपवाद फेंकने के बावजूद आपकी वस्तुओं का निपटारा किया जाएगा।

कोशिश यह करने के लिए अपने कोड को बदलने के लिए:

DataTable dt = new DataTable(); 
using (OleDbConnection conn = new OleDbConnection("my_connection_string")) 
using (OleDbDataAdapter adapter = new OleDbDataAdapter("SELECT * from Employees", conn)) 
{ 
    adapter.Fill(dt);  
} 

ध्यान दें कि मैं खंड का उपयोग कर बाहर DataTable परिभाषित करते हैं। यह सुनिश्चित करने के लिए आवश्यक है कि जब आप उपयोग छोड़ते हैं तो तालिका दायरे में होती है। यह भी ध्यान रखें कि आपको डेटाएडाप्टर पर निपटान कॉल या कनेक्शन पर बंद कॉल की आवश्यकता नहीं है। जब आप उपयोग छोड़ते हैं तो दोनों को पूरी तरह से किया जाता है।

ओह।और इतने :-)

+0

डेटा एडेप्टर निश्चित रूप से कनेक्शन खोलने में सक्षम हैं, अब मैं इसे एक उपयोग कथन के अंदर करने के बारे में निश्चित नहीं हूं, लेकिन क्या आप सिर्फ conn को नहीं छोड़ सकते हैं। ओपन() लाइन, और डेटाएडएप्टर कनेक्शन खोलने दें। – GordonB

+0

अच्छा बिंदु। मैंने इसे 2 के तहत भी उल्लेख किया)। :-) मैं कोड उदाहरण –

+0

अपडेट कर सकता हूं क्या डेटाबेस एडाप्टर डेटाबेस में लाखों रिकॉर्ड डंप करने के मामले में एक अच्छा विकल्प हो सकता है (उदाहरण: मेरे डेटाटेबल में 2-3 लाख रिकॉर्ड जो डेटाबेस में हैं ??? –

0

आपके सवालों के जवाब के लिए करने के लिए स्वागत करते हैं:

  1. आदर्श रूप में, आप एक ही DataAdapter, क्योंकि यह पहले से ही प्रदर्शन किया है यह आरंभीकरण है आपके पास रहेगा। DataAdapter SelectCommand, UpdateCommand, InsertCommand और DeleteCommand जैसे गुण प्रदान करता है जो आपको डेटासोर्स पर इन अलग-अलग फ़ंक्शन करने के लिए अलग-अलग कमांड ऑब्जेक्ट्स सेट करने की अनुमति देता है। तो, आप देखते हैं, डेटा एडाप्टर कई आदेशों के लिए पुन: उपयोग किए जाने के लिए डिज़ाइन किया गया है (उसी डेटाबेस कनेक्शन के लिए)। कमांडबिल्डर का उपयोग (हालांकि, अनुशंसित नहीं है) SelectCommand का विश्लेषण करके अन्य कमांड बनाता है, इस प्रकार आप एक ही कमांडबिल्डर का उपयोग करके अपडेट, डिलीट और इन्सर्ट करने की अनुमति देते हैं।

  2. डाटाएडाप्टर को डेटाबेस कनेक्शन को पूरी तरह से संभालने की अनुमति देना सर्वोत्तम है। @Rune Grimstad पहले से ही इस अंतर्निहित व्यवहार पर विस्तारित है और इसे समझना उपयोगी है। आदर्श रूप से, कनेक्शन जल्द से जल्द बंद होना चाहिए।

0

रुने ग्रिमास्टेड के उत्कृष्ट उत्तर में जोड़ने के दो अतिरिक्त विवरण हैं।

सबसे पहले, कमांडबिल्डर (यदि इसकी आवश्यकता है) IDISposable लागू करता है, और इसलिए अपने स्वयं के 'उपयोग' कथन में लपेटा जाना चाहिए। आश्चर्यजनक रूप से (कम से कम मेरे लिए), डेटा एडाप्टर का निपटान संबंधित कमांडबिल्डर को निपटाने के लिए प्रतीत होता है। जब मैंने ऐसा करने में असफल रहा तो समस्या यह थी कि भले ही मैंने डेटा एडाप्टर पर निपटान कहा था, और कनेक्शन स्थिति 'बंद' थी, मैं डेटाबेस को अद्यतन करने के लिए कमांडबिल्डर का उपयोग करने के बाद एक अस्थायी डेटाबेस को नहीं हटा सका।

दूसरा, कथन "... उस स्थिति में आपको डेटा एडाप्टर पर मैन्युअल रूप से InsertCommand, UpdateCommand या DeleteCommand सेट करने की आवश्यकता है ..." हमेशा सही नहीं होता है। कई मामूली मामलों के लिए, कमांडबिल्डर स्वचालित रूप से डेटाएडाप्टर को दिए गए SELECT कथन के आधार पर, और डेटाबेस से मेटा डेटा के आधार पर सही INSERT, अद्यतन और DELETE कथन बनाएगा। 'ट्रिविअल', इस मामले में, इसका मतलब है कि केवल एक ही तालिका का उपयोग किया जाता है और उस तालिका में प्राथमिक कुंजी होती है जिसे SELECT कथन के हिस्से के रूप में वापस किया जाता है।

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