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.
- Gespeicherte Abfragen
- 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]; |
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:
- Executing SQL Statements in VBA Code
- MS Access: Determine number of records affected by an Execute command in Access 2003/XP/2000/97