जवाबों:
दूसरी ओर, यह:
की कीमत पर:
तो वास्तव में यह इस बात पर निर्भर करता है कि आप क्या कर रहे हैं, लेकिन मैं एक DataReader को प्राथमिकता देता हूं, जब तक कि मुझे किसी ऐसी चीज की जरूरत नहीं है जो केवल डेटासेट द्वारा समर्थित हो। SqlDataReader केवल-पढ़ने के लिए ग्रिड के लिए सामान्य डेटा एक्सेस मामले के लिए एकदम सही है।
अधिक जानकारी के लिए, आधिकारिक Microsoft दस्तावेज़ देखें ।
while (reader.Read())लूप के अंदर एक IDataRecord के रूप में DataReader कास्ट को वापस लाने के लिए एक इटरेटर ब्लॉक का उपयोग करें ।
इसका जवाब काफी व्यापक हो सकता है।
अनिवार्य रूप से, मेरे लिए प्रमुख अंतर जो आमतौर पर मेरे निर्णयों को प्रभावित करता है जिस पर उपयोग करने के लिए यह है कि SQLDataReader के साथ, आप डेटाबेस से डेटा "स्ट्रीमिंग" कर रहे हैं। SQLDataAdapter के साथ, आप डेटाबेस से डेटा को एक ऐसी वस्तु में निकाल रहे हैं, जिसे स्वयं आगे बढ़ाया जा सकता है, साथ ही साथ CRUD संचालन भी किया जा सकता है।
स्पष्ट रूप से डेटा की एक धारा के साथ SQLDataReader तेजी से है, लेकिन आप केवल एक समय में एक रिकॉर्ड की प्रक्रिया कर सकते हैं। SQLDataAdapter के साथ, आपके पास अपने कोड के साथ काम करने / पास करने के लिए डेटाबेस से आपकी क्वेरी से मेल खाने वाली पंक्तियों का एक पूरा संग्रह है।
चेतावनी: यदि आप SQLDataReader, ALWAYS, ALWAYS, ALWAYS का उपयोग कर रहे हैं, तो सुनिश्चित करें कि आप कनेक्शन को बंद करने के लिए उचित कोड लिखते हैं क्योंकि आप SQLDataReader के साथ कनेक्शन खुला रख रहे हैं। ऐसा करने में विफलता, या परिणामों को संसाधित करने में त्रुटि के मामले में कनेक्शन को बंद करने के लिए उचित त्रुटि हैंडलिंग, कनेक्शन लीक के साथ आपके आवेदन को क्रिप्पल करेगा ।
मेरे VB को क्षमा करें, लेकिन SqlDataReader का उपयोग करते समय आपके पास कम से कम कोड होना चाहिए:
Using cn As New SqlConnection("..."), _
cmd As New SqlCommand("...", cn)
cn.Open()
Using rdr As SqlDataReader = cmd.ExecuteReader()
While rdr.Read()
''# ...
End While
End Using
End Using
समतुल्य सी #:
using (var cn = new SqlConnection("..."))
using (var cmd = new SqlCommand("..."))
{
cn.Open();
using(var rdr = cmd.ExecuteReader())
{
while(rdr.Read())
{
//...
}
}
}
SqlDataAdapter का उपयोग आमतौर पर DataSet या DataTable को भरने के लिए किया जाता है और इसलिए आपके कनेक्शन बंद होने के बाद डेटा तक आपकी पहुंच होगी (डिस्कनेक्ट की गई पहुंच)।
SqlDataReader एक तेज़ फ़ॉरवर्ड-ओनली और कनेक्टेड कर्सर है जो आमतौर पर डेटासेट / डेटाटेबल भरने की तुलना में अधिक तेज़ होता है।
इसके अलावा, SqlDataReader के साथ, आप एक समय में अपने डेटा एक रिकॉर्ड के साथ सौदा करते हैं, और मेमोरी में कोई डेटा नहीं रखते हैं। स्पष्ट रूप से एक DataTable या DataSet के साथ, आपके पास ओवरहेड एक मेमोरी आवंटन है।
यदि आपको अपने डेटा को मेमोरी में रखने की आवश्यकता नहीं है, तो केवल सामान प्रदान करने के लिए, SqlDataReader के लिए जाएं। यदि आप डिस्कनेक्ट किए गए फैशन में अपने डेटा से निपटना चाहते हैं, तो डेटासेट या डेटाटेबल भरने के लिए डेटा एडेप्टर चुनें।
डेटाबेस से इन-मेमरी डेटासेट / डेटाटेबल को पॉप्युलेट करने के लिए SqlDataAdapter का उपयोग करें। फिर आपके पास कनेक्शन को बंद / डिस्पोज़ करने, मेमोरी में पास / सेट करने योग्य / पास करने का लचीलापन है। फिर आप डेटा में हेरफेर कर सकते हैं और इसे डीबी में वापस डाल सकते हैं डेटा एडाप्टर का उपयोग करते हुए, सम्मिलितकोमांड / अपडेटडोमैंड के साथ संयोजन में।
तीव्र, निम्न-स्मृति पदचिह्न डेटा एक्सेस की आवश्यकता के बिना लचीलेपन की आवश्यकता के लिए एक SqlDataReader का उपयोग करें, उदाहरण के लिए अपने व्यावसायिक तर्क के आसपास डेटा पास करना। यह बड़े डेटा संस्करणों की त्वरित, कम-मेमोरी उपयोग पुनर्प्राप्ति के लिए अधिक इष्टतम है क्योंकि यह सभी डेटा को एक बार में सभी मेमोरी में लोड नहीं करता है - SqlDataAdapter दृष्टिकोण के साथ, डेटासेट / डेटाटेबल सभी डेटा से भरा होगा बहुत सी पंक्तियाँ और स्तंभ हैं, जिन्हें रखने के लिए बहुत सारी मेमोरी की आवश्यकता होगी।
भरण फ़ंक्शन आंतरिक रूप से DataReader का उपयोग करता है। यदि आपका विचार "कौन सा अधिक कुशल है?", तो एक तंग लूप में एक DataReader का उपयोग करके जो संग्रह रिकॉर्ड-दर-रिकॉर्ड को पॉप्युलेट करता है, सिस्टम पर DataAdapter.Fill का उपयोग करने के समान लोड होने की संभावना है।
(System.Data.dll, System.Data.Common.DbDataAdapter, FillInternal।)