Löschen von Datensätzen mit der Delete-Methode

Mit der Delete-Methode wird der aktuelle Datensatz oder eine Gruppe von Datensätzen in einem Recordset-Objekt zum Löschen markiert. Wenn das Recordset-Objekt das Löschen von Datensätzen nicht zulässt, tritt ein Fehler auf. Wenn Sie sich im sofortigen Aktualisierungsmodus befinden, werden Löschungen in der Datenbank sofort durchgeführt. Wenn ein Datensatz nicht erfolgreich gelöscht werden kann (z.B. aufgrund einer Verletzung der Datenbankintegrität), bleibt der Datensatz nach dem Aufruf von Update. im Bearbeitungsmodus. Das bedeutet, dass Sie die Aktualisierung mit CancelUpdate abbrechen müssen, bevor Sie den aktuellen Datensatz verlassen (z.B. mit Close, Move, oder NextRecordset ).

Wenn Sie sich im Modus Batchupdate befinden, werden die Datensätze zur Löschung aus dem Cache markiert und die tatsächliche Löschung erfolgt, wenn Sie die Methode UpdateBatch aufrufen. (Um die gelöschten Datensätze anzuzeigen, setzen Sie die Eigenschaft Filter nach dem Aufruf von Delete auf adFilterAffectedRecords).

Der Versuch, Feldwerte aus dem gelöschten Datensatz abzurufen, erzeugt einen Fehler. Wenn Sie einen Datensatz gelöscht haben, bleibt der gelöschte Datensatz so lange aktuell, bis Sie zu einem anderen Datensatz wechseln. Sobald Sie sich von dem gelöschten Datensatz entfernen, ist er nicht mehr zugänglich.

Wenn Sie Löschungen in einer Transaktion verschachteln, können Sie gelöschte Datensätze mit der Methode RollbackTrans wiederherstellen. Wenn Sie sich im Modus Batchupdate befinden, können Sie eine ausstehende Löschung oder eine Gruppe von ausstehenden Löschungen mit der Methode CancelBatch abbrechen.

Wenn der Versuch, Datensätze zu löschen, aufgrund eines Konflikts mit den zugrundeliegenden Daten fehlschlägt (z.B. weil ein Datensatz bereits von einem anderen Benutzer gelöscht wurde), gibt der Anbieter Warnungen an die Sammlung Errors zurück, hält die Programmausführung aber nicht an. Ein Laufzeitfehler tritt nur auf, wenn es bei allen angeforderten Datensätzen Konflikte gibt.

Wenn die dynamische Eigenschaft Unique Table gesetzt ist und das Recordset das Ergebnis einer JOIN-Operation auf mehrere Tabellen ist, löscht die Delete-Methode nur Zeilen aus der in der Eigenschaft Unique Table genannten Tabelle.

Die Delete-Methode nimmt ein optionales Argument entgegen, mit dem Sie angeben können, welche Datensätze von der Delete-Operation betroffen sind. Die einzigen gültigen Werte für dieses Argument sind eine der folgenden ADO AffectEnum Enumerationskonstanten:

  • adAffectCurrent Betrifft nur den aktuellen Datensatz.

  • adAffectGroup Betrifft nur Datensätze, die der aktuellen Einstellung der Eigenschaft Filter entsprechen. Die Eigenschaft Filter muss auf einen FilterGroupEnum-Wert oder ein Array von Bookmarks eingestellt sein, um diese Option zu verwenden.

Der folgende Code zeigt ein Beispiel für die Angabe von adAffectGroup beim Aufruf der Methode Delete. Dieses Beispiel ergänzt das Beispiel Recordset um einige Datensätze und aktualisiert die Datenbank. Anschließend filtert es das Recordset mit Hilfe der Enumerationskonstante adFilterAffectedRecords filter, so dass nur die neu hinzugefügten Datensätze im Recordset sichtbar sind. Schließlich ruft es die Methode Delete auf und gibt an, dass alle Datensätze, die der aktuellen Einstellung der Eigenschaft Filter entsprechen (die neuen Datensätze), gelöscht werden sollen.

'BeginDeleteGroup  
    'add some bogus records  
    With objRs  
        For i = 0 To 8  
            .AddNew  
            .Fields("CompanyName") = "Shipper Number " & i + 1  
            .Fields("Phone") = "(425) 555-000" & (i + 1)  
            .Update  
        Next i  
  
        ' update  
        .UpdateBatch  
  
        'filter on newly added records  
        .Filter = adFilterAffectedRecords  
        Debug.Print "Deleting the " & .RecordCount & _  
                    " records you just added."  
  
        'delete the newly added bogus records  
        .Delete adAffectGroup  
        .Filter = adFilterNone  
        Debug.Print .RecordCount & " records remain."  
    End With  
'EndDeleteGroup