2010-11-04 8 views
20

मैं इस एक सार्वजनिक कक्षा में है:सी # आप sqldatareader से डेटासेट कैसे वापस करते हैं?

SqlConnection myConnection = new SqlConnection("Data Source=hermes;database=qcvalues; Integrated Security=SSPI;"); 
myConnection.Open(); 
SqlDataReader myReader = null; 
SqlCommand myCommand = new SqlCommand(InitializeQuery(), myConnection); 
myReader = myCommand.ExecuteReader(); 

मैं एक नियंत्रण के डेटा स्रोत की जरूरत myReader से डाटासेट मिलता है।

दुर्भाग्य से ऐसा करना मुश्किल है क्योंकि नियंत्रण एक रूप (एक अलग वर्ग) पर है। मैं अपने फॉर्म पर नियंत्रण की datasource संपत्ति में myReader डेटासेट कैसे वापस करूँगा?

+0

उपयोग अगर आप केवल वापस आ रहा एक परिणाम सेट है। यदि आपके पास एकाधिक हैं तो डेटासेट का उपयोग करें। – Dismissile

+0

एक टिप्पणीकर्ता के अनुसार [यहां] (http://www.velocityreviews.com/forums/t99983-does-sqldataadapter-fill-always-close-the-connection.html), जो DataAdapter के लिए कोड दिखाता है। वहां भरें आप इसे पढ़ना चाहते हैं, फिल विधि का अपना प्रयास है-अंततः कनेक्शन बंद कर देता है ताकि आपको यह नहीं करना पड़े। यह भी देखें [यह SO सवाल] (http://stackoverflow.com/questions/2472854/does-डेटाएटर- भरें- बंद करें- कनेक्शन- when-an-exception-is-thrown)। जब तक आप अपने कोड में कनेक्शन नहीं खोलते, तब तक कोई अपवाद होने पर कनेक्शन बंद हो जाएगा। – DOK

उत्तर

39

आप नहीं करते हैं। बजाय एक DataAdapter का उपयोग करें:

var ds = new DataSet(); 

using(var conn = new SqlConnection(connString)) 
{ 
    conn.Open(); 
    var command = new SqlCommand(InitializeQuery(), conn); 
    var adapter = new SqlDataAdapter(command); 

    adapter.Fill(ds); 
} 
+0

@justin आप pycoder के उत्तर के बारे में क्या सोचते हैं –

+1

@ मैं एक लड़की हूं - यह काम करेगा। दूसरी ओर, डेटाएडाप्टर के लिए यह है (आपके डेटा का इन-मेमोरी प्रस्तुति प्राप्त करना और उसे कंटेनर में रखना)। –

+1

मेरा मानना ​​है कि डेटा एडाप्टर कनेक्शन खोलने और बंद करने के लिए करेगा। क्या यह एक उपयोग कथन में भी लपेटना वांछनीय है? – DOK

20

अगर आप DataAdapter उपवर्ग का उपयोग करें या के रूप में कुछ का उपयोग कर सकते हैं:

DataTable myTable = new DataTable(); 

myTable.Load(myCommand.ExecuteReader()); 

और फिर ग्राहक के लिए DataTable लौट आते हैं।

+1

यह एक अच्छा विचार है यदि आपको केवल डेटाटाबल की आवश्यकता है, न कि संपूर्ण डेटासेट। – DOK

+3

आम तौर पर सभी डेटासेट को वापस करने के लिए नहीं किया जाता है यदि एक साधारण क्वेरी पंक्तियों का एक सेट लौटाती है :) – pyCoder

+1

मैं async/await के लिए Command.ExecuteReaderAsync() का लाभ लेना चाहता था फिर भी डेटाटेबल लौटाता हूं। यह इसे पूरा करने का सबसे अच्छा तरीका है। धन्यवाद। –

4

बजाय एक SqlDataReader लौटने की, आप अपने कोड इतना है कि यह एक डेटासेट रिटर्न बदल सकते हैं।

SqlConnection myConnection = new SqlConnection("Data Source=hermes;database=qcvalues; Integrated Security=SSPI;"); 
DataSet dst = new DataSet(); 
SqlDataAdapter dap = new SqlDataAdapter(InitializeQuery(), mConnection); 
dap.Fill(dst, "DataSetName"); 

इस दृष्टिकोण के बारे में साफ-सुथरा चीजों में से एक यह है कि भरें आपके लिए डेटाबेस कनेक्शन खुलता है और बंद कर देता है।

+1

डेटासेट होना आवश्यक नहीं है - आप केवल डेटाटेबल भर सकते हैं जो उपयुक्त होने पर अधिक हल्का होगा। – AdaTheDev

+0

@adathe क्या आप मुझे दिखा सकते हैं कि –

+0

@DOK डेटासेट नाम क्या होना चाहिए। –

1

यदि आपका चयन कॉमांड संग्रहीत प्रक्रिया है, तो एडाप्टर की भर विधि अपवाद बढ़ेगी। इन मामलों में आप का उपयोग कर सकते हैं: एक DataTable

   DataTable dt = new DataTable(); 
       dt = sdr.GetSchemaTable(); 
       dt.Constraints.Clear(); 
       dt.BeginLoadData(); 
       dt.Load(sdr); 
       //dt.EndLoadData(); // Enables constraints again 
0
IDataReader reader; 
DataSet ds; 

while (!reader.IsClosed) 
    ds.Tables.Add().Load(reader); 
+0

मुझे समझ में नहीं आ रहा है कि यह जवाब क्यों नकार दिया गया। यह * सवाल करता है "मेरे रीडर से डेटासेट प्राप्त करें"। इतना ही आसान। – Cesar

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