2017-06-24 9 views
0

Ich habe eine Datentabelle und ich implementiere eine Funktion, die angibt, ob die Datentabelle in meiner Anwendung seit dem Laden aus der Datenbank nicht geändert wurde.Wie überprüft man, ob die Datentabelle nicht geändert wurde?

Zum Beispiel keine Zeilen hinzugefügt, keine Zeilen bearbeitet, keine, da es gelöschten Zeilen aus Datenbank geladen (I kümmern sich nicht um den Fall, wenn die Datenänderungen in der Datenbank und nicht in meiner Datentabelle zum Ausdruck kommt)

I umgesetzt etwas wie folgt aus:

'DataTable clean means it has not been changed 
    Public ReadOnly Property DataTableClean As Boolean 
     Get 
      Dim Clean As Boolean = True 
      For i = 0 To DataTable.Rows.Count - 1 
       If DataTable.Rows(i).RowState <> DataRowState.Unchanged Then 
        Clean = False 
        Exit For 
       End If 
      Next 
      Return Clean 
     End Get 
    End Property 

Dieser Code macht den Job, aber ich bin nicht sehr komfortabel mit der Leistung bei der Datentabelle große Anzahl von Zeilen enthält.

Weiß jemand bitte, wenn es irgendwo eine Flagge gibt, die anzeigt, ob die Datentabelle geändert wurde oder nicht?

Danke.

+0

Ich habe ein Beispiel für RowChanged https://code.msdn.microsoft.com/Working-with-DataTable-2ff5f158 und schlug nur eine konkrete Klasse mit Erweiterungsmethoden gekoppelt, um es einfach zu machen, mit GetChanges https zu arbeiten://1drv.ms/u/s!AtGAgKKpqdWjiFTrJbO3P9RZSfNo, das ursprünglich für ein C# -Codeproben erstellt wurde. Im GetChanges-Projekt, Codemodul ExtensionMethods.vb gibt es ein einfaches Beispiel, um sich mit den Erweiterungen vertraut zu machen. Wenn Sie einfach die C# -Version online überprüfen, die auch hier hilfreich sein kann, https://code.msdn.microsoft.com/Get-changes-for-a-11413e32 –

Antwort

0

Meiner Meinung nach können Sie DataTable.GetChanges folgende Funktion verwenden

Wenn Sie Änderungen finden es bedeutet, es Änderung enthält, so dass Sie ansonsten False Wahr zurück.

Weitere Einzelheiten zu MSDN: https://msdn.microsoft.com/en-us/library/k2552649(v=vs.110).aspx

+0

Dies ist ein guter Anfang. Aber wenn AcceptChanges aufgerufen wird, gibt GetChanges nichts zurück, trotz der Tatsache, dass die Änderungen nicht in der Datenbank reflektiert wurden (kein DataAdapter.Update-Aufruf), was nicht das ist, wonach ich suche. Trotzdem danke. –

+0

Das ist einfach, aber die Hauptfunktion von GetChanges ist das Abrufen aller geänderten Zeilen. Dies erfordert eine Schleife bis zum Ende des DataRow-Satzes. Dies könnte weniger performant sein als der OP-Code, der in der ersten Zeile stoppt. – Steve

+1

@ThomasCarlton Wenn Ihr Code irgendwo AcceptChanges aufruft, wird auch Ihr Code keine Änderung finden – Steve

3

Der einzige Weg, ich weiß, eine teure Schleife und die Verfolgung von Änderungen an der Datentabelle, auch bei einem Aufruf von AcceptChanges zu vermeiden, wird die Einrichtung Event-Handler für die RowChanged und RowDeleted-Ereignisse.
Wenn Sie diese Ereignisse erhalten, können Sie eine boolesche Variable auf Klassenebene festlegen, die den Clean-Status behält.

Private Boolean Clean = True 
Public Sub AddChangedTrackStatus(dt as DataTable) 
    AddHandler dt.RowChanged, AddressOf ChangeEvent 
    AddHandler dt.RowDeleted, AddressOf ChangeEvent 
    Clean = True 
End Sub 

Private Sub ChangeEvent(sender as Object, args as DataRowChangeEventArgs) 
    Clean = False 
End Sub 

Public ReadOnly Property DataTableClean As Boolean 
    Get 
     Return Clean 
    End Get 
End Property 

Noch hat diese Probleme hier, weil wir zum Zeitpunkt einer Tabelle verfolgen und, wenn Sie eine allgemeine Lösung wollen zur Zeit mehr als eine Tabelle verfolgen, dann müssen Sie eine Art Sammlung Management in dieser Klasse (private Liste hinzufügen , hinzufügen/entfernen). Vergessen Sie nicht, die Clean-Variable beim Aktualisieren der Datenbank zurückzusetzen.

Verwandte Themen