如何遍历数据表


143

我需要遍历一个DataTable。我在那里有一列名为ImagePath

当我使用时,DataReader我这样做:

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

如何使用来实现相同的目的DataTable


1
dr.Read()从网络缓冲区中逐行读取数据,而不是从数据库中逐行读取数据。从数据库中只能读取一次。因此,从数据表读取不会提供任何性能提升。
developer747

Answers:


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)上述解决方案在哪里?
乔吉,2016年

@RehanKhan- cmd将要执行的SQL命令。如果您使用的是LINQ,则可以编写LINQ查询并以这种方式获取结果。
贾斯汀·涅斯纳

为什么不使用for循环而不是foreach?行仅使用一次,所以for循环会带来更好的性能?
恩里科

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

我是从记忆中写出来的。
希望这给您足够的提示以了解对象模型。

DataTable-> DataRowCollection-> DataRow(可使用columnName或ordinal使用&查找该行的列内容)。

-> =包含。


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 delete语句即可!
米奇小麦
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.