DataSet Zusammenführen und AcceptChanges zu bekommen DiffGram
Ich habe zwei XML-Datensätze ds1 und ds2. Ich lese diese Daten-sets mit .ReadXML(name, XmlReadMode.ReadSchema). Ich werde versuchen, ein DiffGram mit den unterschieden zwischen den beiden mit einem zusammengeführten Datensatz wie unten gezeigt.
DataSet ds3 = new DataSet();
ds3.Merge(ds1);
ds3.AcceptChanges();
ds3.Merge(ds2);
DataSet ds4 = ds3.GetChanges();
ds4.WriteXml("ds4.xml", XmlWriteMode.DiffGram);
ds1 und ds2 jede enthält mehrere Elemente. Erstellt habe ich ds2 durch kopieren der ds1-Datei und ändern der Datensätze.
Allerdings, wenn ich mir anschaue, ds4.xml nach der Ausführung, es zeigt alle Datensätze ds1 und alle Datensätze in ds2 (es zeigt also, doppelte Einträge), und der ds2-updates als ... " diffgr:hasChanges="inserted">. Es scheint, dass dies nur einfügen, nicht vorhandene Datensätze zu aktualisieren.
Wie bekomme ich den ds4 nur die änderung, die vorgenommen wurde, in ds2?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Dieses Verhalten von einfügen versus Aktualisierung tritt in der Regel aufgrund des Fehlens von definierten primary keys. Haben Sie Primärschlüssel für die Tabellen? Das ist, wie die Spalten sind aufeinander abgestimmt während eines merge. Pro MSDN (Hervorhebung von mir):
Daher, für jeden
DataTable
sollten Sie diePrimaryKey
Eigenschaft. Ich schrieb eine ausführliche Beispiel auf der MSDN -DataTable.Merge
Seite vor ein paar Jahren. Sie können werfen Sie einen Blick auf das schreiben hier oben: Verschmelzen mit Primären Schlüssel für die zu Erwartenden Ergebnisse.Kurz ein Beispiel für diesen Ansatz:
EDIT: in Bezug auf Ihren Kommentar, Sie könnten lehnen Sie die änderungen auf zusammengeführte Zeilen, die waren nicht wirklich geändert, indem die Tabelle durch den folgenden code. Eine Methode akzeptiert eine
DataTable
wäre ordentlicher. Es ist wichtig, dass dieser code vor dem Aufruf derDataTable.AcceptChanges()
Methode, sonst wird die Zeile Staaten, werden verworfen.Mit LINQ:
Wenn LINQ ist keine option:
Können Sie anrufen
dt1.AcceptChanges()
nachdem dies geschehen ist.