【问题标题】:How do i delete a row from my dataset, using Rowstate and Delete() [duplicate]如何使用 Rowstate 和 Delete() 从我的数据集中删除一行 [重复]
【发布时间】:2025-12-01 06:05:01
【问题描述】:

可能重复:
Error: Deleted row information cannot be accessed through the row. (C#)

当我尝试从我的 DataSet 中删除一行时出现此错误:

已删除的行信息无法通过行访问

我该如何解决这个问题。

下面是我的函数:

    private void btnDelete_Click(object sender, EventArgs e)
    {
       var result =  MessageBox.Show("Proceed to deleting this location?", "Delete Location", MessageBoxButtons.YesNo, MessageBoxIcon.Warning);
       if (result == DialogResult.Yes)
       {
            var row = myData.xspArea.FindByxar_Id(pRow.xar_Id);
            if (row.RowState != DataRowState.Deleted)
            {
                row.Delete();
                MessageBox.Show("This location has been deleted", "Location Deleted", MessageBoxButtons.OK, MessageBoxIcon.Information);
            }
       }
       else
       {
          this.Close();
       }
    }

【问题讨论】:

  • 我认为你需要在 row.Delete() 之后调用mData.AcceptChanges()
  • @YaqubAhmad: AcceptChanges 将阻止数据库中的更新,因为行状态是数据适配器用来确定如何处理行的内容。

标签: c# dataset rowstate


【解决方案1】:

我认为您需要在 row.Delete() 之后调用 mData.AcceptChanges()

编辑:

正如@Tim Schmelter 所说: AcceptChanges 将阻止数据库中的更新,因为行状态是数据适配器用来确定如何处理行的内容

【讨论】:

  • AcceptChanges 将阻止数据库中的更新,因为行状态是数据适配器用来确定如何处理该行的内容。
【解决方案2】:

可能值得阅读MSDN documentation 以了解row.Delete() 应该做什么。

如果行的 RowState 被添加,则 RowState 变为 Detached 并且 当您调用 AcceptChanges 时,该行将从表中删除。

在您对某个对象使用 Delete 方法后,RowState 变为 Deleted 现有的数据行。在您调用 AcceptChanges 之前,它一直处于已删除状态。在 这一次,DataRow 已从表中删除。

可以通过调用 RejectChanges 取消删除已删除的行。

所以,row.Delete() 会将row.RowState 更改为DataRowState.Deleted

如果您希望从 DataSet 中实际删除您的行,您需要调用 row.AcceptChanges()

【讨论】:

    【解决方案3】:

    我假设异常实际上是在FindByxar_Id(pRow.xar_Id) 上引发的,而不是稍后在row.Delete(); 上引发的。您是否使用pRow 创建了 DataRow 的副本,或者该行是否也被删除(可能通过级联删除约束)?那么你就不能访问xar_Id,因为它已经被删除了。

    所以也检查一下:

    // ...
    if(pRow.RowState != DataRowState.Deleted)
    {
        var row = myData.xspArea.FindByxar_Id(pRow.xar_Id);
        if (row.RowState != DataRowState.Deleted)
        {
            row.Delete();
            // ...
        }
    // ...
    

    如果你想更新数据库,你需要使用DataAdapter

    【讨论】: