Cách lặp qua DataTable


143

Tôi cần phải lặp qua a DataTable. Tôi có một cột có tên ImagePath.

Khi tôi đang sử dụng, DataReadertôi làm theo cách này:

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

Làm thế nào tôi có thể đạt được điều tương tự bằng cách sử dụng DataTable?


1
dr.Read () đọc từng hàng từ bộ đệm mạng, không đọc từng hàng từ cơ sở dữ liệu. Chỉ có một lần tìm nạp từ cơ sở dữ liệu. Do đó đọc từ một dữ liệu sẽ không cung cấp bất kỳ hiệu suất tăng.
nhà phát

Câu trả lời:


286
DataTable dt = new DataTable();

SqlDataAdapter adapter = new SqlDataAdapter(cmd);

adapter.Fill(dt);

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

... Giả sử kết nối đang mở và lệnh được thiết lập đúng. Tôi cũng không kiểm tra cú pháp, nhưng nó sẽ cho bạn ý tưởng.


giả sử ai đó đang tìm kiếm một linqgiải pháp và tự hỏi đâu là (cmd)giải pháp trên?
Jogi

@RehanKhan - cmdsẽ là Lệnh SQL để thực thi. Nếu bạn đang sử dụng LINQ, bạn sẽ viết Truy vấn LINQ của mình và nhận kết quả theo cách đó.
Justin Niessner

Tại sao không sử dụng cho vòng lặp thay vì foreach? hàng chỉ được sử dụng một lần, vậy vòng lặp sẽ cho hiệu suất tốt hơn?
Enrico

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

Tôi đang viết điều này từ bộ nhớ.
Hy vọng điều này cung cấp cho bạn đủ gợi ý để hiểu mô hình đối tượng.

DataTable-> DataRowCollection-> DataRow(mà người ta có thể sử dụng và tìm nội dung cột cho hàng đó, bằng cách sử dụng tên cột hoặc thứ tự).

-> = chứa.


21

Bạn cũng có thể sử dụng các tiện ích mở rộng linq cho DataSets:

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

Xin lưu ý rằng để có AsEnumerable()cho DataTablebạn cần phải System.Data.DataSetExtensionsđược thêm vào như một phụ thuộc.
sigod

Không khả dụng trong .Net Core xem tại đây: stackoverflow.com/questions/45900952/ trên
Markive

5

Các ví dụ trên khá hữu ích. Nhưng, nếu chúng ta muốn kiểm tra xem một hàng cụ thể có giá trị cụ thể hay không. Nếu có thì xóa và phá vỡ và trong trường hợp không tìm thấy giá trị lỗi ném thẳng. Mã dưới đây hoạt động:

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 ";
            }
        }

Đây là một cách điên rồ để thực hiện xóa hàng !! Chỉ cần phát ra một tuyên bố xóa TSQL duy nhất!
Mitch Wheat
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.