2014-08-27 49 views
-4

我想弄清楚我的數據表是否包含某一行。所以我使用.Contains方法,但是當我試圖運行我的程序時,遇到了一個MissingPrimaryKeyException,我無法弄清楚。檢查一個表是否包含行C#

DataTable table = dataQuery.executeQuery(); 

foreach(DataRow row in table.Rows) 
{ 
    if(table.Rows.Contains("certainRow")) 
    { 
     blah blah blah 
    ... 

我只是在我第二次調用table.Rows時發生異常,這對我來說沒有任何意義。如果我的表沒有主鍵,那麼在foreach調用中它不會給我一個錯誤嗎?

編輯:我只是意識到,包含做了別的事情比我認爲它沒有。 Matthijs ...是的,這是我想要的。我需要知道「certainRow」實際上是否存在一行,否則我無法操作該行中的數據。

不幸的是,我是C#的新手,並沒有編程任何超過5年的任何東西,所以我不知道是否有一種方法,做我想做的。或者如果我需要自己創造一些東西。

編輯#2: 我想通過使用DataTableReader解決我的問題。

private bool doesExist(string rowName, DataTable table) 
    { 
     bool value = false; 
     DataTableReader reader = new DataTableReader(table); 

     while (reader.Read()) 
     { 
      for (int i = 0; i < reader.FieldCount; i++) 
      { 
       if (reader.GetValue(i) == rowName) 
       { 
        value = true; 
       } 
      } 
     } 
     return value; 
    } 
+4

我不明白你的邏輯。你迭代所有的行,但仍然調用整個'table.Rows' ...不應該像'if(row.Contains(「certainRow」)'' – Matthijs 2014-08-27 17:11:48

+0

你能調試和可視化數據表嗎?檢查所有行在pk col中是否有值? – 2014-08-27 17:12:04

回答

0

您應該能夠使用DataTableReader的更多信息,可以發現here

一個例子,就是:

private static DataTable GetCustomer() 
{ 
    DataTable table = new DataTable(); 
    DataColumn id = table.Columns.Add(@"Id", typeof(int)); 

    table.Columns.Add(@"Name", typeof(string)); 
    table.PrimaryKey = new DataColumn[] { id }; 
    table.Rows.Add(new object[] { 1, @"John" }); 
    return table; 
} 

上面的代碼將建立一個表,你看你定義Primary Key並添加內容。這就是你如何建立表。現在閱讀,你會:

using(DataTableReader reader = new DataTableReader(new DataTable[] { customer })) 
{ 
    do 
    { 
     if(reader.HasRows) 
     { 
       // Do Something 
     } 
    } while (reader.NextResult()); 
} 

正如你可以看到它驗證行存在,然後執行任務。很簡單的例子,希望它有幫助。

.Contains將返回一個boolean爲true或false值。

關於您的評論,您可以撥打reader[@"ColumnName"],它應該嘗試閱讀它沒有問題。所以,如果:

if(reader[@"ColumnName"] != DBNull.Value) 
{ 
    // Do Something. 
} 
+0

該表是使用SQL查詢自動生成的。問題是一些早期數據庫不包含與較新數據庫相同的行/列。請檢查以確保我沒有試圖操縱一個不存在的行。 – LMH 2014-08-27 17:33:33

+0

修改了答案的下半部分 – Greg 2014-08-27 17:41:06

+0

謝謝,您對DataReader的評論最終導致我找到了解決方案...儘管我最終做出了我自己的方法,也許我仍然錯過了已經創建的東西。 – LMH 2014-08-27 18:18:19

0

你可以這樣寫:

bool contains = table.Rows.Cast<DataRow>().SelectMany(r => r.ItemArray).Contains(value); 
相關問題