2009-05-29 4 views
2

Angenommen, ich habe zwei .NET Tables bevölkert wie folgt, wobei ID der Primärschlüssel ist, und wo null bedeutet eine DBNull.Value (nicht die Zeichenfolge "null"):Kann ich zwei .NET DataTables zusammenführen, ohne Nullwerte zusammenzuführen, ohne die Zeilen selbst durchlaufen zu müssen?

 
    |Table A    |   |Table B 
    |ID |Column1 |Column2 |   |ID |Column1 |Column2 | 
    |1 |foo  |10  |   |1 |zzz  |null | 
    |2 |baz  |20  |   |2 |null |99  | 

ich eine Zusammenführung dieser Tabellen tun wollen, wo das Ergebnis wird sein:

 
    |ID |Column1 |Column2 | 
    |1 |zzz  |10  | 
    |2 |baz  |99  | 

Mit anderen Worten, ich die Daten aus der Tabelle B in Tabelle A, wie DataTable.Merge tut, aber anstatt das Kopieren der gesamten Zeile von Tabelle B, wenn die IDs übereinstimmen zusammenführen möchten, Ich möchte nur die Felder kopieren wo Die Daten sind nicht null.

Ich könnte meine eigenen Schleifen durch die Zeilen beider Tabellen schreiben, um dies zu tun, aber ich frage mich, ob es bereits eine Methode in den Bibliotheken gibt, so dass ich meine eigene Version von DataTable.Merge nicht umschreiben muss.

Antwort

1

Ratten ... Ich glaube nicht, wonach ich suche.

Für das, was es wert ist, wenn jemand Blick auf diese das gleiche Bedürfnis hat wie ich, das ist der Code „meine eigene Rolle“, die ich mit endete:

 // Merge 
     foreach (DataRow br in tableB.Rows) 
     { 
      // This assumes a one-column primary key. In my case, 
      // that's valid, but not for a general-purpose function. 
      DataRow ar = tableA.Rows.Find(br[tableB.PrimaryKey[0]]); 
      if (ar == null) 
      { 
       continue; 
       // If I really wanted it to act like DataTable.Merge, it would 
       // add the missing row to tableA rather than just skipping it. 
       // again, I didn't implement this because I didn't need it. 
      } 
      foreach (DataColumn ac in tableA.Columns) 
      { 
       DataColumn bc = tableB.Columns[ac.ColumnName]; 
       if (bc != null && !br.IsNull(bc)) 
        ar[ac] = br[bc]; 
      } 
     } 

Da die Kommentare zeigen, diese macht nicht alles, was DataTable.Merge tut, und macht einige Annahmen, die im Allgemeinen nicht gültig sind. Es wäre nicht schwer, diese Probleme zu beheben. Ich lasse es hier für den Fall, dass es jemandem hilft.

0

Sie konnten dieses versuchen:

public static DataTable Union (DataTable First, DataTable Second) 
{ 

     //Result table 
     DataTable table = new DataTable("Union"); 

     //Build new columns 
     DataColumn[] newcolumns = new DataColumn[First.Columns.Count]; 

     for(int i=0; i < First.Columns.Count; i++) 
     { 
      newcolumns[i] = new DataColumn(
      First.Columns[i].ColumnName, First.Columns[i].DataType); 
     } 

     table.Columns.AddRange(newcolumns); 
     table.BeginLoadData(); 

     foreach(DataRow row in First.Rows) 
     { 
      table.LoadDataRow(row.ItemArray,true); 
     } 

     foreach(DataRow row in Second.Rows) 
     { 
      table.LoadDataRow(row.ItemArray,true); 
     } 

     table.EndLoadData(); 
     return table; 
} 

Von here (nicht getestet).

+0

Nein, das funktioniert nicht ... wie geschrieben, fügt einfach die Zeilen der zweiten Tabelle am unteren Rand hinzu, ohne Zeilen mit der gleichen PK zu aktualisieren (da Sie den "Union" nicht den Primärschlüssel hinzugefügt haben Tabelle). Ich habe versucht, LoadDataRow nach dem Hinzufügen des Primärschlüssels, aber das tut dasselbe wie DataTable.Merge - es aktualisiert die gesamte Zeile mit allen Werten aus der zweiten Tabelle, einschließlich der Nullen. Ich landete meine eigene ... oh well. – Micah

Verwandte Themen