【问题标题】:How to delete a specific row from a datatable based on a specific value?如何根据特定值从数据表中删除特定行?
【发布时间】:2018-01-24 17:10:51
【问题描述】:
private void DeleteMSISDN(string MSISDN)
    {
        DataTable dt = MSISDNTable();

        dt.AsEnumerable().Where(r => r.Field<string>("MSISDN") == MSISDN).ToList().ForEach(row => row.Delete());

    }

当我这样做时,我会收到一个异常 System.Data.DeletedRowInaccessibleException

【问题讨论】:

  • List deleteRows = dt.AsEnumerable().Where(r => r.Field("MSISDN") == MSISDN).ToList(); foreach (DataRow row in deleteRows) row.Delete();
  • @jdweng 关于为什么 OP 代码不起作用有什么想法吗?假设您的代码有效,他的版本看起来也不错(尽管它是单行的)。您可以将其发布为答案。
  • @AdamJoan 发布了一个 reproducible 示例。 MSISDNTable 是否可能返回 same 数据表,导致对已删除的行进行迭代?
  • @AdamJoan 还发布了 full 异常,包括其调用堆栈。现在你/我们不知道 哪里 异常是 trown。可能是对.Delete() 的调用,也可能是对.Field 的调用。你可以通过Exception.ToString()获得它
  • foreach 有一个 MoveNext,当最后一个项目被删除时,您无法执行 MoveNext。

标签: c# asp.net linq lambda


【解决方案1】:

没有代表将此添加为评论,但MSISDNTable(); 如何检索表格?

在执行此函数之前,您是否有另一个进程正在删除行?如果 dt.AsEnumerable().Where(r =&gt; r.Field&lt;string&gt;("MSISDN") == MSISDN) 在删除 ForEach 删除时出错,那么您就会知道一些事情。

【讨论】:

    猜你喜欢
    • 2015-02-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-07-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-15
    相关资源
    最近更新 更多