Transaktionen in Access

Wenn Sie Datenbankaktionen per Code ausführen, also beispielsweise mit der Methode Execute des Database-Objekts oder mit den DAO-Methoden AddNew oder Edit, setzen Sie in der Regel immer nur eine einzige Anweisung ab und ändern so Daten oder auch Tabellen. Was aber, wenn Sie mehrere Aktionen ausführen wollen, die nur dann ausgeführt werden sollen, wenn die Ausführung jeder einzelnen Aktion erfolgreich ist Dann kommen Transaktionen ins Spiel. Hierbei handelt es sich um einen Kontext über eine oder mehrere Datenbankänderungen, der nach dem Ausführung aller änderungen entweder komplett abgeschlossen oder verworfen werden kann.

Beispieldatenbank

Die Beispiele dieses Artikels finden Sie in der Datenbank 1703_Transaktionen.accdb.

Möglichkeiten der änderung von Daten

Unter DAO gibt es verschiedene Möglichkeiten, per Code Daten zu ändern. Die erste Variante nutzt etwa die AddNew-Methode, um einen neuen Datensatz zu einem Recordset hinzuzufügen und schließt den Vorgang nach dem Festlegen der Feldinhalte mit der Update-Methode ab:

Public Sub Datenaenderungen()
    Dim db As DAO.Database
    Dim rst As DAO.Recordset
    Set db = CurrentDb
    Set rst = db.OpenRecordset("tblKategorien", dbOpenDynaset)
    rst.AddNew
    rst!Kategoriename = "Neue Kategorie"
    rst.Update
End Sub

Hier gibt es keine offenen Fragen: Wenn keine Fehlermeldung erscheint, speichert die Prozedur den Datensatz wie gewünscht in der Datenbank. Ein Fehler tritt beispielsweise auf, wenn Sie zwei Mal den gleichen Wert für das Feld Kategoriename in der Datenbank speichern und den eindeutigen Index für dieses Feld verletzen. In diese Fall wird der Datensatz dann einfach nicht gespeichert.

Etwas anders sieht es aus, wenn Sie die Aufgaben mit der Execute-Methode ausführen und dazu eine entsprechende SQL-Abfrage formulieren. Ein ganz einfaches Beispiel sieht wie folgt aus:

Public Sub NeuerDatensatzExecute()
    Dim db As DAO.Database
    Set db = CurrentDb
    db.Execute "INSERT INTO tblKategorien          (Kategoriename) VALUES('Noch eine Kategorie')"
End Sub

Auch hier gilt: Der Datensatz wird entweder eingetragen oder auch nicht. über letzteres werden wir allerdings nicht informiert, denn wir haben den Wert dbFailOnError für den zweiten Parameter der Execute-Methode vergessen. Erst damit setzt es eine Fehlermeldung, wenn Sie beispielsweise versuchen, den gleichen Kategorienamen zwei Mal hintereinander einzufügen (siehe Bild 1).

Fehlermeldung beim Anlegen eines bereits vorhandenen Kategorienamens

Bild 1: Fehlermeldung beim Anlegen eines bereits vorhandenen Kategorienamens

Probleme mit mehreren betroffenen Datensätzen

Nun schauen wir uns an, was passiert, wenn wir mit einer Aktionsabfrage gleich mehrere Datensätze ändern wollen – beispielsweise, indem wir versuchen, alle Einzelpreise in der Tabelle tblArtikel um 10 EUR zu senken:

Public Sub MehrereDatensaetze()
    Dim db As DAO.Database
    Set db = CurrentDb
    db.Execute "UPDATE tblArtikel SET Einzelpreis =                                        Einzelpreis - 10"
    Debug.Print "Betroffene Datensätze: " _
        & db.RecordsAffected
End Sub

Wir verwenden bewusst noch einmal die Variante der Execute-Methode ohnen den Wert dbFailOnError. Was geschieht Es wird natürlich keine Fehlermeldung ausgelöst und wir erhalten im Direktfenster die folgende Ausgabe:

Betroffene Datensätze: 38

Das heißt, dass von den 77 Datensätzen dieser Tabelle nur 38 geändert wurden. Bei den übrigen hat die Gültigkeitsregel gegriffen, die besagt, dass nur Werte größer oder gleich 0 in das Feld eingegeben werden dürfen. Welche Erkenntnis ziehen wir daraus Aktionsabfragen, die sich auf mehrere Datensätze beziehen, werden unter Umständen nicht komplett ausgeführt.

Fügen wir dem Aufruf der Execute-Methode hingegen wieder den Wert dbFailOnError als zweiten Parameter hinzu, wird die Abfrage insgesamt nicht ausgeführt, sondern die Gültigkeitsmeldung erscheint (siehe Bild 2):

Fehlermeldung bei Verletzung der Gültigkeitsregel bei mindestem einem der betroffenen Datensätze

Bild 2: Fehlermeldung bei Verletzung der Gültigkeitsregel bei mindestem einem der betroffenen Datensätze

db.Execute "UPDATE tblArtikel SET Einzelpreis = Einzelpreis - 10", dbFailOnError

Wenn Sie eine solche Abfrage über die Benutzeroberfläche über den Abfrageentwurf formulieren und starten, erhalten Sie eine Fehlermeldung wie in Bild 3. Hier erhalten Sie zwar keine genaue Angabe, warum die Daten nicht aktualisiert werden können, aber immerhin haben Sie die Möglichkeit, die Aktualisierung abzubrechen.

Fehlermeldung, wenn nicht alle Daten geändert werden können

Bild 3: Fehlermeldung, wenn nicht alle Daten geändert werden können

Möchten Sie weiterlesen? Dann lösen Sie Ihr Ticket!
Hier geht es zur Bestellung des Jahresabonnements des Magazins Access [basics]:
Zur Bestellung ...
Danach greifen Sie sofort auf alle rund 400 Artikel unseres Angebots zu - auch auf diesen hier!
Oder haben Sie bereits Zugangsdaten? Dann loggen Sie sich gleich hier ein:

Schreibe einen Kommentar