2016-06-21 47 views
0

我正在尋找一個關鍵字的PDF文件,並返回其上該關鍵字被發現的頁面。如果關鍵字被發現,我將返回頁面列表和文件名。但是,如果關鍵字未在PDF文件中找到,我想刪除數據表中的行。刪除從數據表中的一行在C#

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(行)」),我得到這個錯誤時的頁面被稱爲「System.InvalidOperationException:集合已修改;枚舉操作可能不會執行」

對此提出建議?註釋?修復?歡迎各界...

鮑勃

回答

4

你的代碼是獲得從數據庫中的一些數據,例如,你的程序可以使用它。

你得到唯一的例外是因爲你想修改(刪除元素)你迭代的集合,這就是不可能的。

您可以通過創建您存儲要刪除的行臨時List解決這個問題。一旦你完成了迭代,你可以迭代臨時列表並刪除你不想要的東西。

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); 
} 
+0

感謝馬里奧斯。它似乎解決了我的問題的第一部分。 –

0

嘗試一個簡單的刪除

row.Delete(); 

然後在循環後

dt.AcceptChanges(); 

,但它可能會失敗
看到答案馬里奧
它可能工作,如果它真的只標記刪除行