วิธีการวนซ้ำผ่าน DataTable


143

DataTableฉันจำเป็นต้องย้ำผ่าน ImagePathฉันมีคอลัมน์ที่มีชื่อ

เมื่อฉันใช้DataReaderฉันทำด้วยวิธีนี้:

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

ฉันจะประสบความสำเร็จในสิ่งเดียวกันโดยใช้DataTable?


1
dr.Read () อ่านทีละแถวจากบัฟเฟอร์เครือข่ายไม่ใช่ทีละแถวจากฐานข้อมูลมีเพียงหนึ่งดึงข้อมูลจากฐานข้อมูล ดังนั้นการอ่านจากดาต้าดาต้าไม่ได้เป็นการเพิ่มประสิทธิภาพใด ๆ
นักพัฒนา

คำตอบ:


287
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)ในวิธีการแก้ปัญหาข้างต้น?
Jogi

@RehanKhan - cmdจะเป็นคำสั่ง SQL เพื่อดำเนินการ หากคุณใช้งาน LINQ คุณจะต้องเขียนคำสั่ง LINQ ของคุณและรับผลลัพธ์ในลักษณะนั้น
Justin Niessner

ทำไมไม่ใช้ลูปแทน foreach? แถวถูกใช้เพียงครั้งเดียวดังนั้นสำหรับลูปจะให้ประสิทธิภาพที่ดีขึ้นหรือไม่
Enrico

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

ฉันกำลังเขียนสิ่งนี้จากความทรงจำ
หวังว่านี่จะช่วยให้คุณมีคำใบ้พอที่จะเข้าใจโมเดลวัตถุ

DataTable-> DataRowCollection-> DataRow(อันใดอันหนึ่งที่สามารถใช้ & ค้นหาเนื้อหาคอลัมน์สำหรับแถวนั้นไม่ว่าจะใช้ columnName หรือลำดับ)

-> = มี


21

คุณยังสามารถใช้ส่วนขยาย linq สำหรับชุดข้อมูล:

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

โปรดทราบว่าจะต้องมีAsEnumerable()สำหรับDataTableคุณจะต้องมีการSystem.Data.DataSetExtensionsเพิ่มเป็นการพึ่งพา
sigod

ไม่พร้อมใช้งานใน. Net Core ดูที่นี่: 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 ลบคำสั่งเดียว!
มิทช์ข้าวสาลี
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.