In einem früheren Beitrag haben wir mit einer Funktion geprüft, ob eine Datenbank geöffnet ist. Diese war jedoch nicht in jedem Fall zuverlässig – also liefern wir eine neue Version für eine solche Funktion. In dieser neuen Funktion versuchen wir, die Datenbank exklusiv zu öffnen. Das gelingt nur, wenn diese aktuell nicht geöffnet ist. Mehr dazu im vorliegenden Beitrag!
In der Funktion namens IsDatabaseOpen, die wir im Beitrag Kunde zu einer E-Mail öffnen (www.access-im-unternehmen.de/1291) vorgestellt haben, prüfen wir nur, ob sich im gleichen Verzeichnis der Datenbank auch eine .laccdb-Datei befindet. Diese wird normalerweise erstellt, wenn die Datenbank geöffnet ist.
Carsten Gromberg hat uns darauf hingewiesen, dass diese Funktion nicht immer das korrekte Ergebnis liefert und eine verbesserte Version der Funktion beigesteuert.
Dabei verwenden wir einen zuverlässigeren Weg, um zu prüfen, ob eine Datenbank geöffnet ist. Dabei versuchen wir, die Datenbank exklusiv zu öffnen. Das ist nur möglich, wenn die Datenbank bisher gar nicht geöffnet ist.
Die neue Version der Funktion IsDatabaseOpen finden Sie in Listing 1. Die Funktion erwartet den Pfad zu der zu untersuchenden Datenbankdatei sowie einen Boolean-Parameter, der angibt, ob bei bereits geöffneter Datenbank eine Meldung ausgegeben werden soll.
Public Function IsDatabaseOpen(ByVal strDBName As String, _ Optional ByVal bolShowMessage As Boolean) As Boolean Dim objEngine As DAO.PrivDBEngine Set objEngine = New DAO.PrivDBEngine On Error Resume Next objEngine.OpenDatabase strDBName, True, True If Not Err.Number = 0 Then IsDatabaseOpen = True End If If IsDatabaseOpen And bolShowMessage Then MsgBox strDBName & vbCrLf _ & "kann nicht exklusiv geöffnet werden!" & vbCrLf & vbCrLf _ & "Fehler: " & CStr(Err.Number) & vbCrLf _ & Err.Description, vbExclamation End If Set objEngine = Nothing End Function
Listing 1: Funktion zum Prüfen, ob eine Datenbank bereits geöffnet ist
Die Funktion erstellt ein Objekt auf Basis der verborgenen Klasse PrivDBEngine, die im Gegensatz zu DBEngine eine neue Session außerhalb der Session der aktuellen Datenbank öffnet und somit unabhängig ist. Warum das wichtig ist, schauen wir uns weiter unten an.
Nach dem Erstellen von objEngine deaktiviert die Funktion zunächst die eingebaute Fehlerbehandlung. Somit kann sie die nachfolgende OpenDatabase-Methode des PrivDBEngine-Objekts ausführen, ohne dass ein Fehler an die Benutzeroberfläche gemeldet wird, falls das Öffnen der angegebenen Datenbank nicht gelingt. Beim Aufruf der OpenDatabase-Methode übergeben wir drei Parameter:
- Name: Pfad zu der zu öffnenden Datenbank
- Options: Die Bezeichnung Options ist etwas irreführend. Eigentlich können Sie hier nur einen Boolean-Wert angeben, der festlegt, ob die Datenbank im Exklusivmodus geöffnet werden soll oder nicht. Wir wollen diese exklusiv öffnen, also übergeben wir den Wert True.
- Readonly: Hier geben wir den Wert True an, da das Öffnen in diesem Modus performanter ist.
Wenn die Datenbank aktuell geöffnet ist, löst die OpenDatabase-Methode beim exklusiven Öffnen einen Fehler aus. Wir wissen also, dass die Datenbank beim Auftreten eines Fehlers offensichtlich bereits geöffnet ist und somit nicht mehr exklusiv geöffnet werden kann. Also prüft die folgende If…Then-Bedingung, ob Err.Number ungleich 0 ist. Ist das der Fall, wurde ein Fehler ausgelöst, weil die Datenbank nicht geöffnet werden konnte. Also stellen wir den Wert des Funktionsergebnisses auf True ein.
Die folgende If…Then-Bedingung prüft, ob IsDatabaseOpen nicht den Wert True hat und ob beim Aufruf der zweite Parameter bolShowMessage auf True eingestellt wurde. Sind beide Bedingungen erfüllt, gibt die Funktion noch eine Meldung aus, die darauf hinweist, dass die zu untersuchende Datenbank bereits geöffnet ist. Wurde beim Öffnen mit OpenDatabase kein Fehler ausgelöst, gibt die Funktion den Wert True zurück.
Warum PrivDBEngine statt DBEngine?
Manchmal entdecke auch ich noch neue Klassen in den VBA-Bibliotheken. In diesem Fall ist es PrivDBEngine. Warum nutzen wir diese Klasse und nicht einfach DBEngine?
Nur für Abonnenten
Ab hier wird’s wirklich spannend – der Rest ist exklusiv für Abonnenten.
Mit dem Abo von Access im Unternehmen bekommst du den kompletten Artikel – inklusive vollständigem Code, Beispieldatenbank und Schritt-für-Schritt-Erklärung.
So sparst du dir stundenlanges Herumprobieren, vermeidest teure Fehler in deiner Access-Anwendung und kannst Lösungen direkt in deinem Unternehmen einsetzen, statt nur darüber zu lesen.
Teste Access im Unternehmen jetzt 4 Wochen lang kostenlos: Voller Zugriff auf alle Artikel, Downloads und Beispieldatenbanken. Kein Risiko – wenn es für dich nicht passt, kündigst du einfach innerhalb der ersten vier Wochen.
Bereits Abonnent? Hier einloggen
Kostenlos & unverbindlich
Oder hast Du eine konkrete Frage zu Deiner eigenen Access-Anwendung?
Vielleicht stellt Deine Anwendung Dich vor eine Herausforderung, zu der Du bisher keine Lösung findest. Schlechte Performance, kein ausreichender Zugriffsschutz, Du bist unsicher über Dein Datenmodell oder Dein Code liefert unerklärliche Fehler?
In unserem kostenlosen Access-Audit schaut sich André Minhorst persönlich gemeinsam mit Dir Deine Lösung per Zoom an – und zeigt Dir, wo Datenmodell, VBA-Code, Ergonomie und Sicherheit Optimierungspotenzial bieten.
Jetzt kostenloses Access-Audit anfordern →