Prüfen, ob Datenbank geöffnet ist

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?

Ende des frei verfügbaren Teil. Wenn Du mehr lesen möchtest, hole Dir ...

den kompletten Artikel im PDF-Format mit Beispieldatenbank

diesen und alle anderen Artikel mit dem Jahresabo

Schreibe einen Kommentar