2013-04-04 40 views
-2

這是一個C#Windows應用程序。數據庫循環算法讓我瘋狂

我在內存中有2個數據表,我會稱它們爲GoodTableBadTable。行和列的數量是相同的,列名稱也是一樣的。 BadTable中的所有行在大多數列中都有不良數據。我需要遍歷BadTable中的所有行,並將所有列中的數據替換爲GoodTable中匹配行的數據。但是,有2個列名需要在更新時跳過,我將它們稱爲SkipColumn1SkipColumn2

我已經嘗試了嵌套for循環的嵌套foreach循環的許多版本以跟蹤列數,我的結果只是遍佈整個地方。如果有任何數據庫循環忍者在那裏,我將不勝感激的幫助。

+2

是否有(有效的)ID列?爲什麼不使用簡單的SQL語句? – 2013-04-04 12:24:58

+2

休息5分鐘。簡化並分解問題,並慢慢重新創建解決方案。 – mauris 2013-04-04 12:25:21

+1

你如何識別一行?您可以循環遍歷「Good」表中的所有行(就好像該行不在Good Table中那樣您不能更新Bad中的任何內容),並使用table從「Bad」表中選擇相應的DataRow。選擇。一旦擁有該行,您可以通過遍歷table.Columns集合並忽略具有不需要的名稱的兩列來更新所需的列。 – dash 2013-04-04 12:25:24

回答

0

這是我接受,因爲它的答案最乾淨的,在我看來最簡單的。

for (var i = 0; i < GoodDT.Rows.Count; i++) 
{ 
    for (var x = 0; x < GoodDT.Columns.Count; x++) 
    { 
     if (BadDT.Columns[x].ColumnName != "skip1" && BadDT.Columns[x].ColumnName != "skip2") 
     { 
      BadDT.Rows[i][x] = GoodDT.Rows[i][x]; 
     } 
    } 
} 
0

事情是這樣的:

 var goodTable = new DataTable(); 
     var badTable = new DataTable(); 

     // some initialization code (add columns, fill with data)... 

     var columnNames = goodTable 
      .Columns 
      .Cast<DataColumn>() 
      .Where(column => column.ColumnName != "SkipColumn1" && column.ColumnName != "SkipColumn2") 
      .Select(column => column.ColumnName) 
      .ToArray(); 

     for (var i = 0; i < goodTable.Rows.Count; i++) 
     { 
      foreach (var columnName in columnNames) 
      { 
       badTable.Rows[i][columnName] = goodTable.Rows[i][columnName]; 
      } 
     } 
+0

與此相關的一個問題是,它假定兩行中的行的順序相同。否則,同意。 – dash 2013-04-04 12:35:57

+0

@dash:是的,你說得對。我不知道,爲什麼我會這樣想。 :)另一方面,OP沒有說什麼,他如何識別行... – Dennis 2013-04-04 12:44:14