In Microsoft Access gibt es zwei Hauptmethoden, um Datenbankabfragen auszuführen: durch gespeicherte Abfragen und mittels direkter SQL-Statements. Jede Methode hat ihre eigenen Vor- und Nachteile und Einsatzgebiete. In diesem Artikel werden wir beide Methoden ausführlich betrachten und ihre Anwendungen in verschiedenen Szenarien diskutieren.

  1. Gespeicherte Abfragen
  2. SQL-Statements

Gespeicherte Abfragen

Existiert bereits eine Access-Abfrage, die man ausführen möchte, dann reicht ein DoCmd.OpenQuery, um dies zu tun. Das ist beispielsweise dann interessant, wenn es sich um Update-, Delete-… Abfragen handelt, da man so die Datenbasis sehr einfach bearbeiten kann.

Vorteile:

  • Wiederverwendung: Einmal erstellt, können gespeicherte Abfragen jederzeit aufgerufen und ausgeführt werden.
  • Benutzerfreundlichkeit: Sie bieten eine grafische Benutzeroberfläche, die es auch Nicht-Programmierern ermöglicht, komplexe Abfragen zu erstellen.
  • Effizienz: Access optimiert gespeicherte Abfragen, was oft zu einer schnelleren Ausführung führt.
  • Sicherheit: Sie können mit Parametern arbeiten, was die Sicherheit gegenüber SQL-Injection erhöht.

Nachteile:

  • Flexibilität: Weniger flexibel als direkte SQL-Statements, da Änderungen an der Abfragestruktur eine Anpassung der gespeicherten Abfrage erfordern.
  • Komplexität: Bei sehr komplexen Abfragen kann die grafische Benutzeroberfläche unübersichtlich werden.

Anwendungsszenarien:

  • Regelmäßige Datenberichte
  • Einfache Datenmanipulationen (z.B. Aktualisierungen, Löschungen)
  • Schnittstellen für Endbenutzer, um bestimmte Datenabfragen durchzuführen

Ausführen von Änderungsabfragen oder Löschabfragen (sog. Aktionsabfragen)

DoCmd.OpenQuery "qry_XXX"

Da derartige Abfragen meist störende Fenster öffnen, die darauf hinweisen, dass XY Datensätze gelöscht/geändert werden, kann man die OpenQuery-Befehle mit folgendem Code umschließen, und man bekommt keine lästigen Hinweise mehr:

DoCmd.SetWarnings False ' Deaktiviert Warnmeldungen
DoCmd.Hourglass True ' Zeigt den Wartecursor
DoCmd.OpenQuery "..." ' Führt die Abfrage aus
DoCmd.SetWarnings True ' Aktiviert Warnmeldungen wieder
DoCmd.Hourglass False ' Stellt den normalen Cursor wieder her

SetWarnings deaktiviert/aktiviert die Hinweise und Hourglass ändert den Mauszeiger, damit man weiß, dass etwas geschieht.

Man kann den Abfragen auch Parameter übergeben:

Dim db As DAO.Database
Dim qdfTmp As DAO.QueryDef
Set db = CurrentDb
Set qdfTmp = db.QueryDefs("Name der Query")
qdfTmp.Parameters("NameParameter1") = "Parameterwert1"
qdfTmp.Parameters("NameParameter2") = "Parameterwert2"
DoCmd.SetWarnings False
DoCmd.OpenQuery "Name der Query"
DoCmd.SetWarnings True

Die entsprechende Query dazu:

PARAMETERS [NameParameter1] Text(50), [NameParameter2] Text(50);
SELECT *
FROM MeineTabelle
WHERE Feld1 = [NameParameter1]
AND Feld2 = [NameParameter2];

vgl. dazu

Meine bevorzugte Variante ist, die SQL-Abfrage mit Platzhaltern zu versehen und diese mittels VBA zu ersetzen und wieder zurückzuschreiben.

Dim db As DAO.Database
Dim qdfTmp As DAO.QueryDef
Set db = CurrentDb
Set qdfTmp = db.QueryDefs("Name der Query")
Dim mySQL as String
mySQL = qdfTmp.SQL
mySQL = Replace(mySQL,"%Var%","richtiger Text")
qdfTmp.SQL = mySQL
DoCmd.SetWarnings False
DoCmd.OpenQuery "Name der Query"
DoCmd.SetWarnings True
Set qdfTmp = Nothing
Set db = Nothing

Alternative

Dim db As DAO.Database
Dim qdfTmp As DAO.QueryDef
Set db = CurrentDb
Set qdfTmp = db.QueryDefs("Name der Query")
qdfTmp.Execute
Set qdfTmp = Nothing
Set db = Nothing

Anzeigen von Select-Abfragen:

DoCmd.OpenQuery "qry_Select1", , acReadOnly

SQL-Statement

SQL-Statements sind eine flexiblere Methode, um direkt mit der Datenbank zu interagieren. In Access können sie über VBA (Visual Basic for Applications) ausgeführt werden.

Vorteile:

  • Flexibilität: Ermöglicht die dynamische Erstellung und Modifizierung von Abfragen direkt im Code.
  • Kontrolle: Bietet volle Kontrolle über die Abfrage und ihre Ausführung.
  • Erweiterte Funktionen: Ermöglicht den Einsatz von SQL-Funktionen und -Operationen, die in der grafischen Benutzeroberfläche nicht verfügbar sind.

Nachteile:

  • Komplexität: Erfordert Kenntnisse in SQL und VBA.
  • Sicherheitsrisiken: Fehlende Parameterisierung kann zu SQL-Injection führen.
  • Wartung: Änderungen im Code können aufwendiger sein, vor allem wenn der Code schlecht dokumentiert ist.

Anwendungsszenarien:

  • Komplexe Datenmanipulationen, die über die Möglichkeiten der grafischen Benutzeroberfläche hinausgehen
  • Dynamische Abfragen, deren Parameter zur Laufzeit festgelegt werden
  • Automatisierung von Datenbankoperationen innerhalb von VBA-Skripten
' Ausführen eines SQL-Statements mit DoCmd.RunSQL
Dim mySQL as String
mySQL = "UPDATE titles SET price = price * 1.10"
DoCmd.RunSQL mySQL

Oder mittels:

' Ausführen eines SQL-Statements mit der Database.Execute Methode
Dim mySQL as String
Dim db as Database
Set db = CurrentDB()
mySQL = "UPDATE titles SET price = price * 1.10"
db.Execute mySQL
' Aufräumarbeiten
Set db = Nothing

Vorteil der zweiten Methode: Man kann die Anzahl der geänderten Teile mittels db.RecordsAffected ermitteln.

Fazit

Die Wahl zwischen gespeicherten Abfragen und direkten SQL-Statements hängt von verschiedenen Faktoren ab, darunter die Komplexität der Abfrage, die erforderliche Flexibilität, die Benutzererfahrung und der Kontext, in dem die Abfrage ausgeführt wird. In vielen Fällen können eine Kombination beider Methoden und ein Verständnis ihrer Stärken und Schwächen die effektivste Lösung bieten.

Links: