2012-04-12 12 views
3

Ich habe eine DataTable, die vom Benutzer geändert wird. Ich möchte identifizieren, was geändert wurde, und das in der Datenbank speichern.So kopieren/klonen Sie eine DataTable

Der beste Weg, den ich sehe, ist das Kopieren dieser DataTable, bevor irgendwelche Änderungen vorgenommen werden und überprüfen, was geändert wurde, wenn der Benutzer das Formular speichert.

Das Problem ist, dass, ob ich myDataTable.Clone() oder myDataTable.Copy() verwenden, die Daten immer gleich sind. Ich schätze, sie erstellen nur Referenzen zwischen den Tabellen.

Wie würden Sie damit umgehen?

+0

Wenn Sie nur Unterschiede verfolgen möchten, sollten Sie DataRowState in Betracht ziehen - http://msdn.microsoft.com/en-us/library/system.data.datarowstate.aspx – dsolimano

Antwort

3

Versuchen Sie die DataSet.HasChanges Methode. Dies wird Ihnen sagen, wenn es irgendwelche Änderungen an dem Datensatz gewesen, wie gelöscht oder hinzugefügt Reihen, geänderten Zeilen usw.

Sie auch DataSet.GetChanges um zu sehen, was sich verändert hat nennen. Diese Methode gibt eine Kopie der Änderungen zurück.

Zum Beispiel könnte man sagen:

private void VerifyChanges(DataSet dataSet) 
{ 
    if(!dataSet.HasChanges(DataRowState.Modified)) return; 
    var changedDataSet = dataSet.GetChanges(DataRowState.Modified); 

    //... do the tracking or whatever else you want here.   
} 

Oder wenn Sie wollen alle DataSet Änderungen nicht bekommen, und wollen nur die Änderungen aus einer bestimmten Tabelle:

private void VerifyChanges(DataSet dataSet, string tableName) 
{ 
    if(!dataSet.HasChanges(DataRowState.Modified)) return; 
    var changedTable = dataSet 
     .Tables[tableName] 
     .GetChanges(DataRowState.Modified); 

    //... do the tracking or whatever else you want here.   
} 

Zuletzt, um die ursprünglichen Werte aus dem modifizierten DataSet zu ziehen, könnten Sie codieren:

row[columnIndex, DataRowVersion.Original] 
+0

Vielen Dank. Ich habe gerade getestet und ja, es gibt die modifizierten Zeilen zurück. Obwohl es mir nicht den ursprünglichen Wert gibt! – Mathieu

+0

@Mathieu, Siehe meine aktualisierte Antwort. – Matt

+0

Das funktioniert wie ein Zauber! – Mathieu

0

IMO, der schnelle und schmutzige Weg wäre serialize dann deserialize der DataTable. Wenn Sie sich für die XML-Serialisierung entscheiden, müssen Sie die DataTable zuerst in einem DataSet verschachteln.

0

Verwenden Sie DataTable.GetChanges Method (DataRowState). Diese Methode gibt eine neue Datentabelle mit den Zeilen zurück, die geändert wurden.

Beispiel:

DataTable changeTable = table.GetChanges(DataRowState.Modified); 

diese Tabelle Nachdem Sie die Zeilen one-by-one mit einer anderen Datentabelle vergleichen.

+0

Danke. Es gibt die geänderten Zeilen zurück. Obwohl es mir nicht den ursprünglichen Wert gibt! – Mathieu

Verwandte Themen