2009-07-04 12 views
47

मैंने अभी यह विषय देखा: Datatable vs Dataset लेकिन यह मेरे संदेह को हल नहीं किया .. मुझे बेहतर समझाएं, मैं डेटाबेस के साथ कनेक्शन कर रहा था और परिणामों को ग्रिड व्यू में दिखाने के लिए आवश्यक था। (मैंने रिकॉर्डबेट का उपयोग किया था जब मैंने वीबी 6 के साथ काम किया था और डेटासेट इस तरह के समान था, इसलिए डेटासेट का उपयोग करना बहुत आसान था।) फिर एक लड़के ने मुझे बताया कि डेटासेट करने का सबसे अच्छा तरीका नहीं था ..क्या बेहतर है: डेटासेट या डेटा रीडर?

तो, क्या मुझे डेटा रीडर सीखना चाहिए या डेटासेट का उपयोग करना चाहिए? विवरण सारणी ? पेशेवर/विपक्ष क्या हैं?

उत्तर

67

यह आपकी आवश्यकताओं पर निर्भर करता है। सबसे महत्वपूर्ण अंतरों में से एक यह है कि डेटा रीडर आपके डेटाबेस तक एक खुला कनेक्शन बनाए रखेगा जब तक कि आप इसके साथ नहीं कर लेते हैं, जबकि डेटासेट एक इन-मेमोरी ऑब्जेक्ट होगा। यदि आप DataReader पर नियंत्रण बांधते हैं तो यह अभी भी खुला है। इसके अतिरिक्त, डेटा रीडर डेटा पढ़ने के लिए एकमात्र एकमात्र दृष्टिकोण है जिसे छेड़छाड़ नहीं किया जा सकता है। डेटासेट के साथ आप आगे बढ़कर डेटा को कुशलतापूर्वक देख सकते हैं।

कुछ अतिरिक्त विशेषताएं: डेटासेट को एक्सएमएल में क्रमबद्ध और प्रतिनिधित्व किया जा सकता है और इसलिए, आसानी से अन्य स्तरों के आसपास पारित किया जा सकता है। डेटा रीडर को क्रमबद्ध नहीं किया जा सकता है।

दूसरी तरफ यदि आपके पास किसी डेटाबेस नियम के लिए कुछ प्रक्रियाओं को संभालने वाले डेटाबेस से पढ़ने के लिए बड़ी मात्रा में पंक्तियां हैं, तो डेटारिएडर सभी पंक्तियों के साथ डेटासेट लोड करने के बजाय अधिक समझदारी कर सकता है स्मृति और संभवतः स्केलेबिलिटी को प्रभावित करता है।

यहां एक लिंक है जो थोड़ा दिनांकित है लेकिन अभी भी उपयोगी है: Contrasting the ADO.NET DataReader and DataSet

+0

लिंक टूटा हुआ है। कृपया इसे ठीक करें या हटा दें। –

4

विभिन्न आवश्यकताओं, विभिन्न समाधान।

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

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

तो, हाँ, इसे सीखें - लेकिन उचित होने पर ही इसका उपयोग करें। डेटासेट आपको अधिक लचीलापन देता है।

+0

धन्यवाद एवीडी और अहमद ने तेज़ उत्तरों के लिए मगेड किया .. मुझे इसके बारे में बहुत कुछ सोचने लगेगा (एन 'सीखें)! :) – Daniel

0

अपने दूसरे प्रश्न का उत्तर देने के लिए - हाँ, आपको डेटा रीडर के बारे में जानना चाहिए। यदि कुछ भी है, तो आप समझते हैं कि उनका उपयोग कैसे करें।

मुझे लगता है कि आप डेटासेट्स का उपयोग करके इस स्थिति में बेहतर हैं - क्योंकि आप डेटा बाध्यकारी कर रहे हैं और सभी (मैं सीपीयू चक्र बनाम मानव प्रयास कर रहा हूं)।

किसके लिए बेहतर प्रदर्शन होगा। यह आपकी स्थिति पर निर्भर करता है। उदाहरण के लिए, यदि आप डेटा को संपादित कर रहे हैं तो आप बाध्यकारी हैं और परिवर्तनों को बैच कर रहे हैं तो आप डेटासेट

187

के साथ बेहतर होंगे: यह आवश्यक है: "कौन सा बेहतर है: एक बाल्टी या नली?"

DataSet यहां बाल्टी है; यह आपको डेटा के डिस्कनेक्ट किए गए सेट को ले जाने और इसके साथ काम करने की अनुमति देता है - लेकिन आपको बाल्टी ले जाने की लागत लग जाएगी (इसलिए इसे उस आकार में रखने के लिए सबसे अच्छा है जिसे आप सहज रखते हैं)।

डेटा-पाठक नली है: यह एक-तरफा/डेटा तक पहुंच प्रदान करता है क्योंकि यह आपके पीछे उड़ता है; आपको एक ही समय में सभी उपलब्ध पानी नहीं लेना पड़ता है, लेकिन इसे टैप/डेटाबेस से कनेक्ट करने की आवश्यकता है।

और उसी तरह आप एक नली के साथ एक बाल्टी भर सकते हैं, तो आप डेटा-रीडर के साथ DataSet भर सकते हैं।

बिंदु मैं बनाने के लिए कोशिश कर रहा हूँ कि वे अलग अलग बातें करते हैं ...

मैं व्यक्तिगत रूप से DataSet बहुत बार उपयोग नहीं करते हैं - बस कुछ लोग उन्हें प्यार करते हैं। हालांकि, मैं बीएलओबी एक्सेस इत्यादि के लिए डेटा-पाठकों का उपयोग करता हूं

+46

वहां अच्छा सादृश्य है। – cjk

+0

@Marc, अच्छा सादृश्य। जब आप बीएलओबी के साथ काम नहीं कर रहे हैं, तो आप किस प्रकार की डेटा एक्सेस का उपयोग करते हैं? – Ash

+1

@Ash - आम तौर पर LINQ-to-SQL, 'SqlBulkCopy' या' IDataReader'। * बहुत * शायद ही कभी, 'डेटाटेबल'। वास्तव में लगभग दो बार (कभी)। –

12

Marc's बिंदु पर आगे: आप किसी भी डेटाबेस के साथ डेटासेट का उपयोग कर सकते हैं।

आप इसे किसी XML फ़ाइल से या केवल एक प्रोग्राम से भर सकते हैं। इसे एक डेटाबेस से पंक्तियों के साथ भरें, फिर चारों ओर मुड़ें और इसे एक अलग डेटाबेस में लिखें।

डेटासेट एक रिलेशनल स्कीमा का एक पूरी तरह से स्मृति में प्रतिनिधित्व है। चाहे आप इसे वास्तविक रिलेशनल डेटाबेस के साथ कभी भी इस्तेमाल करते हैं या नहीं, आप पर निर्भर है।

+4

सिर्फ रिकॉर्ड के लिए, यह डेटा-पाठकों के बारे में भी सच है - "सीएसवीआरडर", "डेटाटेबल रीडर" आदि देखें और इसे वापस डेटाबेस में धक्का देने के लिए, एसक्लबल्ककॉपी (उदाहरण के रूप में) डेटाटेबल या आईडीटा रीडर के साथ काम करेगा। –

0

DataReader

DataReader डेटाबेस से डेटा को पढ़ने के लिए प्रयोग किया जाता है और यह एक पढ़ा है और डेटाबेस से डेटा लाने के दौरान आगे केवल कनेक्शन उन्मुख वास्तुकला। डाटासेट की तुलना में डेटा रीडर डेटा को तेज़ी से लाएगा। आम तौर पर हम डाटाएडर को डेटा बाध्य करने के लिए ExecuteReader ऑब्जेक्ट का उपयोग करेंगे।

GridView को DataReader डेटा बाध्य करने के लिए के रूप में की तरह नीचे दिखाया गया है हम कोड लिखने की जरूरत है:

using(SqlConnection conn = new SqlConnection("Data Source=abc;Integrated Security=true;Initial Catalog=Test")) { 
      con.Open(); 
      SqlCommand cmd = new SqlCommand("Select UserName, First Name,LastName,Location FROM Users", conn); 
      SqlDataReader sdr = cmd.ExecuteReader(); 
      gvUserInfo.DataSource = sdr; 
      gvUserInfo.DataBind(); 
      conn.Close(); 

डेटासेट

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

SqlConnection conn = new SqlConnection("Data Source=abc;Integrated Security=true;Initial Catalog=Test"); 
    conn.Open(); 
    SqlCommand cmd = new SqlCommand("Select UserName, First Name,LastName,Location FROM Users", conn); 
    SqlDataAdapter sda = new SqlDataAdapter(cmd); 
    DataSet ds = new DataSet(); 
    da.Fill(ds); 
    gvUserInfo.DataSource = ds; 
    gvUserInfo.DataBind(); 
संबंधित मुद्दे