从C#中删除数据表中的行

时间:2016-06-21 22:00:12

标签: c# datatable

我正在搜索PDF文件中的关键字并返回找到该关键字的网页。如果关键字IS FOUND,我将返回一个页面列表和fileName。但是,如果PDF文件中的关键字未找到,我想删除数据表中的行。

public DataTable dtPubSearchResultsFromFiles(string sqlQuery, string safeKeyword)
{
    // Returns a datatable of publication search results based on PDF files.
    SqlConnection con = new SqlConnection(getConnectionString());
    SqlCommand cmd = new SqlCommand(sqlQuery, con);
    SqlDataAdapter da = new SqlDataAdapter(cmd);
    DataTable dt = new DataTable();
    dt.Columns.Add("Pages", typeof(string));
    da.Fill(dt);
    dt.PrimaryKey = new DataColumn[] { dt.Columns["publicationID"] };

    foreach (DataRow row in dt.Rows)
    {
        //call search function to look for keyword
        List<int> myPages = new List<int>();
        string fileName = row["linkToPublicationPDF"].ToString();
        myPages = ReadPdfFile(fileName, safeKeyword);
        if (myPages.Count > 0)
        {
            string pagelist = "";
                foreach (int page in myPages)
                {
                    pagelist = pagelist + page + "  ";
                }
            row["Pages"] = pagelist;
        }
        else
        {
            //remove/delete the row from the datatable if "myPages.Count" is 0
            dt.Rows.Remove(row);
        }
    }

    return dt;
}

当我添加它(“dt.Rows.Remove(row)”)时,我在页面被调用时遇到此错误“System.InvalidOperationException:Collection被修改;枚举操作可能无法执行。”

连连呢?评论?修复?欢迎所有人......

鲍勃

2 个答案:

答案 0 :(得分:4)

您的代码从数据库中获取某些数据,以便您的程序可以使用它。

您获得的例外情况是因为您正在修改(通过删除元素)您正在迭代的集合并且无法实现这一点。

您可以通过创建存储要删除的行的临时var toRemove = new List<DataRow>(); foreach (DataRow row in dt.Rows) { //call search function to look for keyword List<int> myPages = new List<int>(); string fileName = row["linkToPublicationPDF"].ToString(); myPages = ReadPdfFile(fileName, safeKeyword); if (myPages.Count > 0) { string pagelist = ""; foreach (int page in myPages) { pagelist = pagelist + page + " "; } row["Pages"] = pagelist; } else { //remove/delete the row from the datatable if "myPages.Count" is 0 toRemove.Add(row); } } } foreach (DataRow row toRemove.Add) { dt.Rows.Remove(row); } 来解决此问题。完成迭代后,您可以迭代临时列表并删除您不再需要的内容。

{{1}}

答案 1 :(得分:0)

尝试简单的删除

row.Delete();

然后循环

dt.AcceptChanges();

但它可能会失败 看马里奥的回答 它可能有效,如果它只是标记行删除

相关问题