2011-01-15 14 views
2

Ich habe eine Datentabelle, die aus 72 Spalten bestehen wird.Wie vergleiche ich zwei Datentabellen

Ich werde es in der Excel-Tabelle mit VSTO herunterladen, die gut funktioniert.

Nun ändert der Benutzer entweder eine dieser Zeilen oder alle dieser Zeilen und fügt auch eine neue Zeile ein.

Bei der Datentabelle, die zuerst heruntergeladen wurde, handelt es sich um dtA, und bei der Datentabelle, die in der Excel-Tabelle geändert wurde, um dtB.

Ich möchte dtA und dtB vergleichen.

Ich muss alle Zeilen in dtB herausfinden, die nicht in dtA existieren.

Ich kann nicht foreach Schleife für jede einzelne Zeile und bewerten, da es eine sehr unordentliche Art der Codierung ist.

Was ist ein besserer Weg, dies zu tun?

ich so tat,

DataTable dtA = new DataTable(); 
    dtA.Columns.Add("ENo"); 
    dtA.Columns.Add("ENo1"); 
    dtA.Columns.Add("ENo2"); 
    dtA.Columns.Add("ENo3"); 
    dtA.Columns.Add("ENo4"); 

    for (int i = 0; i < 5; i++) 
    { 
     DataRow dr = dtA.NewRow(); 
     dr[0] = "Part 0 " + i.ToString(); 
     dr[1] = "Part 1 " + i.ToString(); 
     dr[2] = "Part 2 " + i.ToString(); 
     dr[3] = "Part 3 " + i.ToString(); 
     dr[4] = "Part 4 " + i.ToString(); 
     dtA.Rows.Add(dr); 
    } 

    DataTable dtB = new DataTable(); 
    dtB.Columns.Add("ENo"); 
    dtB.Columns.Add("ENo1"); 
    dtB.Columns.Add("ENo2"); 
    dtB.Columns.Add("ENo3"); 
    dtB.Columns.Add("ENo4"); 

    for (int i = 5; i < 10; i++) 
    { 
     DataRow dr = dtB.NewRow(); 
     dr[0] = "Part 0 " + i.ToString(); 
     dr[1] = "Part 1 " + i.ToString(); 
     dr[2] = "Part 2 " + i.ToString(); 
     dr[3] = "Part 3 " + i.ToString(); 
     dr[4] = "Part 4 " + i.ToString(); 
     dtB.Rows.Add(dr); 
    } 

    Response.Write("\n"); 
    Response.Write("dt A"); 
    Response.Write("\n"); 

    for (int i = 0; i < dtA.Rows.Count; i++) 
    { 
     Response.Write(dtA.Rows[i][i].ToString()); 
     Response.Write("\n"); 
    } 

    Response.Write("\n"); 
    Response.Write("dt B"); 
    Response.Write("\n"); 
    for (int i = 0; i < dtB.Rows.Count; i++) 
    { 
     Response.Write(dtB.Rows[i][i].ToString()); 
     Response.Write("\n"); 
    } 

    var VarA = dtA.AsEnumerable(); 
    var varB = dtA.AsEnumerable(); 

    var diff = VarA.Except(varB); 
    Response.Write("except"); 
    foreach (var n in diff) 
    { 
     Response.Write(n.Table.Rows[0].ToString()); 

    } 

Aber ich weiß nicht, was in der foreach var verwenden, Was soll ich pls benutzen?

Antwort

1
SELECT id FROM dtB WHERE id NOT IN (SELECT id FROM dtA) 
+0

Danke James für die Antwort, aber das wird nur die neuen Zeilen holen, was ist mit den Zeilen in dtA bekommen geändert – cmrhema

+0

Ihre ursprüngliche Frage nicht angeben, Änderungen zu finden. Da Excel keine Spalte "ON UPDATE CURRENT TIMESTAMP" haben kann, können Sie versuchen, in der Tabelle ein Makro zu erstellen, das sich in das Worksheet_Change-Ereignis einklinkt. Siehe http://www.ozgrid.com/forum/showthread.php?t=63176&page=1 – James

0

Vielleicht LINQ for DataSets (dies stellt nur die Tatsache, dass Datasets LINQ unterstützen und einen Teil des .NET 3.5+ Framework ist) kann eine Option sein. Vor allem, überprüfen Sie die ExceptRows Set Pattern, die nur IEnumerable.Except verwendet. Es ist am einfachsten, wenn die Zeile eine "eindeutige ID" enthält, aber sie sollte ausreichen, um Fälle abzudecken, in denen die Zeile selbst eindeutig fehlt und/oder erkennt, ob eine Zeile geändert wurde.

Es gibt auch QueryADataSet - das einzige Produkt, das ich weiß "SQL-Syntax auf Daten [Set | Table]" Zeug zu unterstützen (obwohl es [schwach] argumentiert werden könnte, dass LINQ "SQL-Syntax" bietet). Entwicklungslizenzen sind $ 200 pro Pop, aber es könnte sich lohnen, abhängig. (Ich habe keine Verbindung mit, noch habe ich das Produkt ausprobiert; ich stolperte darüber, wenn ich versuchte, eine Lösung für ein ähnliches Problem zu finden, aber letztlich nur meine Vorgehensweise geändert.)

Happy Coding.

+0

Hi pst. Ich habe versucht, die Codierung von der Website http://www.eggheadcafe.com/tutorials/aspnet/2eb80099-3611-43e0-82da-1d5889195d55/comparing-datasets-using-linq.aspx, es funktioniert gut, aber ich beobachte das Wenn einer der Ienumerable einen Wert hat, wird der Ausnahmefehler geworfen. Ich gab wenn newRec.count()> 0 dann etwas Arbeit, wenn es keine Zählung gibt es Fehler wirft, kann nicht konvertieren dbnull in Dezimal. Was könnte die Lösung sein? – cmrhema

0
SELECT dtB.* FROM dtB LEFT JOIN dtA ON dtB.id=dtA.id /* AND ... */ 
WHERE dtA.id IS NULL 

Sie sehen nur Zeilen von dtB, die keine Übereinstimmung in dtA haben.

Sie können alle Spalten hinzufügen, die identisch sein müssen, um als die gleiche Zeile in der JOIN-Bedingung zu zählen.

Je nach Datenbank könnte es einfachere Wege geben. Zum Beispiel hat Oracle das Schlüsselwort MINUS, um nur völlig identische Zeilen zu entfernen; Zeilen, die geändert wurden, werden weiterhin im Ergebnis angezeigt.

Alternativ: Sie können beide Excel-Dateien als Text (CSV, tabulatorgetrennt, ...) exportieren, vorausgesetzt, sie befinden sich in der gleichen Zeilenreihenfolge und verwenden das Befehlszeilenprogramm diff, um zu sehen, was geändert wurde.

Es könnte eine Bibliothek für Ihre Programmiersprache geben, die den diff-Algorithmus implementiert, so dass Sie alles im Speicher ausführen können.

Verwandte Themen