कैसे एक DataTable के माध्यम से iterate करने के लिए


143

मुझे इसके माध्यम से पुनरावृति करने की आवश्यकता है DataTable। मेरे पास एक कॉलम है जिसका नाम है ImagePath

जब मैं उपयोग कर रहा हूँ तो मैं DataReaderइसे इस प्रकार करता हूँ :

SqlDataReader dr = null;
dr = cmd.ExecuteReader();
while (dr.Read())
{
    TextBox1.Text = dr["ImagePath"].ToString();
}

मैं उसी चीज़ का उपयोग करके कैसे प्राप्त कर सकता हूं DataTable?


1
dr.Read () नेटवर्क बफर से पंक्ति द्वारा पंक्ति को पढ़ता है, डेटाबेस से पंक्ति द्वारा पंक्ति नहीं। डेटाबेस से केवल एक ही प्राप्त होता है। इसलिए डेटेबल से पढ़ने से कोई परफॉर्मेंस गेन नहीं हो रहा है।
डेवलपर

जवाबों:


286
DataTable dt = new DataTable();

SqlDataAdapter adapter = new SqlDataAdapter(cmd);

adapter.Fill(dt);

foreach(DataRow row in dt.Rows)
{
    TextBox1.Text = row["ImagePath"].ToString();
}

... मानता है कि कनेक्शन खुला है और कमांड ठीक से सेट है। मैंने सिंटैक्स की भी जांच नहीं की, लेकिन यह आपको विचार देना चाहिए।


मान लीजिए कि कोई linqसमाधान देख रहा है और सोच रहा है (cmd)कि उपरोक्त समाधान में कहां है ?
जोगी

@RehanKhan - cmdनिष्पादित करने के लिए SQL कमांड होगा। यदि आप LINQ का उपयोग कर रहे हैं, तो आप अपना LINQ क्वेरी लिखेंगे और अपना परिणाम प्राप्त करेंगे।
जस्टिन निस्नेर

क्यों नहीं foreach के बजाय लूप के लिए उपयोग करें? पंक्ति केवल एक बार उपयोग की जा रही है, इसलिए लूप के लिए बेहतर प्रदर्शन होगा?
एनरिको

32
foreach (DataRow row in myDataTable.Rows)
{
   Console.WriteLine(row["ImagePath"]);
}

यह मैं स्मृति से लिख रहा हूं।
आशा है कि यह आपको ऑब्जेक्ट मॉडल को समझने के लिए पर्याप्त संकेत देता है।

DataTable-> DataRowCollection-> DataRow(जो किसी का उपयोग कर सकते हैं और उस पंक्ति के लिए स्तंभ सामग्री की तलाश कर सकते हैं, या तो स्तंभ का उपयोग कर सकते हैं या अध्यादेश)।

-> = समाहित है।


21

तुम भी DataSets के लिए linq एक्सटेंशन का उपयोग कर सकते हैं:

var imagePaths = dt.AsEnumerble().Select(r => r.Field<string>("ImagePath");
foreach(string imgPath in imagePaths)
{
    TextBox1.Text = imgPath;
}

कृपया करने के लिए ध्यान दें कि AsEnumerable()के लिए DataTableआपके पास करने की जरूरत है System.Data.DataSetExtensionsएक निर्भरता के रूप में जोड़ दिया।
सिगोड

नेट कोर में उपलब्ध नहीं है यहाँ देखें: stackoverflow.com/questions/45900952/...
Markive

5

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

foreach (DataRow row in dtData.Rows)
        {
            if (row["Column_name"].ToString() == txtBox.Text)
            {
                // Getting the sequence number from the textbox.
                string strName1 = txtRowDeletion.Text;

                // Creating the SqlCommand object to access the stored procedure
                // used to get the data for the grid.
                string strDeleteData = "Sp_name";
                SqlCommand cmdDeleteData = new SqlCommand(strDeleteData, conn);
                cmdDeleteData.CommandType = System.Data.CommandType.StoredProcedure;

                // Running the query.
                conn.Open();
                cmdDeleteData.ExecuteNonQuery();
                conn.Close();

                GetData();

                dtData = (DataTable)Session["GetData"];
                BindGrid(dtData);

                lblMsgForDeletion.Text = "The row successfully deleted !!" + txtRowDeletion.Text;
                txtRowDeletion.Text = "";
                break;
            }
            else
            {
                lblMsgForDeletion.Text = "The row is not present ";
            }
        }

यह पंक्तियों को हटाने का एक पागल तरीका है !! बस एक ही TSQL बयान को मिटा दें!
मिच गेहूं
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.