如何遍历DataTable

193
我需要遍历一个 DataTable。我在其中有一个名为 ImagePath 的列。
当我使用 DataReader 时,我是这样做的:
SqlDataReader dr = null;
dr = cmd.ExecuteReader();
while (dr.Read())
{
    TextBox1.Text = dr["ImagePath"].ToString();
}

如何使用DataTable来实现相同的功能?

1
dr.Read() 从网络缓冲区逐行读取,而不是从数据库逐行读取。只有一次从数据库获取数据。因此,从datatable中读取数据不会提供任何性能上的优势。 - developer747
6个回答

371
DataTable dt = new DataTable();

SqlDataAdapter adapter = new SqlDataAdapter(cmd);

adapter.Fill(dt);

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

假设连接已打开且命令设置正确。我也没有检查语法,但它应该给你一个思路。


1
假设有人正在寻找一个linq解决方案,并想知道上面的解决方案中(cmd)在哪里? - Jogi
@RehanKhan - cmd 是要执行的 SQL 命令。如果你使用 LINQ,你需要编写你的 LINQ 查询并以此方式获取结果。 - Justin Niessner
为什么不使用for循环而使用foreach?因为row只被使用了一次,所以for循环会提供更好的性能。 - Enrico

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

我是凭记忆写下这段话的。
希望这足以让你理解对象模型。

DataTable -> DataRowCollection -> DataRow(其中一个可以使用列名或序号查找该行的列内容)。

-> = 包含。


23

你也可以使用 LINQ 扩展来操作数据集:

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

2
请注意,要在 DataTable 中使用 AsEnumerable(),需要将 System.Data.DataSetExtensions 添加为依赖项。 - sigod
无法在 .Net Core 中使用,请参见此处:https://dev59.com/c1cO5IYBdhLWcg3wXwl3 - Markive

12

已经有很好的解决方案了。以下代码可以帮助其他人查询数据表并获取每行数据表中ImagePath列的值。

  for (int i = 0; i < dataTable.Rows.Count; i++)
  {
       var theUrl = dataTable.Rows[i]["ImagePath"].ToString();
  }

1
你救了我的一天。:) 非常感谢您分享这个非常简单的代码。^_^ - itTech

6
上面的例子非常有用。但是,如果我们想要检查特定行是否具有特定值。如果是,则删除并中断,如果没有找到值,则直接抛出错误。下面的代码可以工作:
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删除语句即可! - Mitch Wheat

1
foreach(DataGridViewRow row in dataGridView1){ var a = row.Cells[4].Value.ToString(); }

3
欢迎来到StackOverflow!虽然这段代码可能回答了问题,但最好包含一些“上下文”,解释它是如何工作的以及何时使用。仅有代码的答案从长远来看并不实用。 - stop-cran

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接