无法从数据集中删除两次

时间:2014-11-22 23:42:07

标签: c# ado.net dataset

我第一次从数据集中删除所有好的 但第二次它给了我这个错误 无法通过该行访问已删除的行信息。

 private void button9_Click(object sender, EventArgs e)
    {
        foreach (DataRow row in ds.Tables["emp"].Rows)
        {
            if (row[0].ToString() == textBox6.Text)
            {
                row.Delete();
                break;
            }
        }
    }

1 个答案:

答案 0 :(得分:3)

通常在枚举时从集合中删除将引发异常:

Collection was modified; enumeration operation might not execute.

在这种情况下,如果尚未添加数据行,则调用DataRow.Delete()不会删除该行;它会将RowState设置为Deleted,但在您致电AcceptChanges之前,该行仍会保留在集合中(请参阅DataRow.Delete()的文档。)

因此该行仍在DataTable中,并且第二次枚举集合时,代码会尝试访问字段值并获得异常:

DeletedRowInaccessibleException: Deleted row information cannot be accessed through the row.

要避免此错误,您可以致电AcceptChanges提交删除,或查看@Grant Winney链接的答案中提到的RowState

要查看此示例,您可以运行以下代码:

var table = new DataTable();
table.Columns.Add("Name", typeof(string));

table.Rows.Add("foo");
table.Rows.Add("bar");

table.AcceptChanges();

foreach(DataRow row in table.Rows)
{
    if ((string)row["Name"] == "foo")
    {
        row.Delete();
    }
}

Console.WriteLine(table.Rows[0].RowState);  // Deleted
Console.WriteLine(table.Rows.Count);        // 2
table.Rows[0].AcceptChanges();
Console.WriteLine(table.Rows.Count);        // 1