DB schließen

09/11/2009 - 20:02 von Raimo Becker | Report spam
Hallo NG,

ich habe eine VB6-Anwendung, die im Netzwerk laufen sollte. Die AW hat ein
lokales FLAG.mdb wo die Nuzterdaten,Einstellungen in einer "fast" immer
geöffneten mdb gespeichert werden.
Die Daten mdb liegt auf einem Netzlaufwerk.
Leider muss irgendwo in den Zugriffen zur Daten.mdb "vergessen" worden sein,
die mdb zu schließen.
Freundlicherweise habe ich das Projekt geerbt und keine (vollstàndige)
Dokumentation erhalten.
Meine Frage: Eigentlich ist es doch überhaupt kein Problem mit mehreren
Usern auf eine mdb zuzugreifen. Was mache ich hier falsch im Code?
-
Sub OpenDB(ByRef db As Object, Optional compress As Boolean)
On Error Resume Next 'Mit Fehlerbehandlung kommt hier natürlich ein Fehler

Dim i As Integer
Dim strErr As String
' Dim FSO As New FileSystemObject -wird nicht mehr gebraucht


For i = 1 To 10
err = 0
Set db = DBEngine.OpenDatabase(DBPath, dbDecrypt, False, ";pwd=" & pwd)
If err = 0 Then
Exit Sub
End If
strErr = err.description
hLogFile.ErrorLog err.Source, err.number, err.description, "OpenDB"
'wird nicht mehr genützt
' SUR_Pause "1"
Next

End Sub
kann ich beim OpenDatabase einen MultiUser Zugriff erzwingen?
Oder sonstwie eine Art fIsDbOpen() einbauen?
Jedesmal bevor ich also den Befehl OpenDB angreife, soll geprüft werden , ob
die Datenbank offen ist, wenn ja dann schließe erst - dann mach weiter.

Ich denke das müsste irgendwie gehen, aber ich steh gerade voll auf dem
Schlauch.
Was ich genau sagen kann : Auf die Abfrage Teilnehmer und Messungen kann ich
von 5 verschieden Rechnern zugreifen. Sobald ich aber ins Detail gehe:Eine
bestimmte Messung eines Teilnehmers, sperrt er mir die gesamte DB

Ich kann und sollte natürlich den gesamten Code durchsuchen, aber gibt es
eine Möglichkeit mir zu sagen nach welcher/m Prozedur/sub die DB noch offen
ist?

Ich hab hier kanpp 50.000 Codezeilen zu durchsuchen.

Grüße
Raimo
 

Lesen sie die antworten

#1 Peter Götz
10/11/2009 - 09:24 | Warnen spam
Hallo Raimo,

ich habe eine VB6-Anwendung, die im Netzwerk laufen sollte.
Die AW hat ein lokales FLAG.mdb wo die Nuzterdaten,
Einstellungen in einer "fast" immer geöffneten mdb
gespeichert werden.
Die Daten mdb liegt auf einem Netzlaufwerk.



Verstehe ich das richtig?
Es gibt zwei Jet-Datenbanken, eine Flag.mdb die lokal beim
Client liegt und eine Daten.mdb die irgendwo auf einem
entfernten Rechner liegt?

Leider muss irgendwo in den Zugriffen zur Daten.mdb
"vergessen" worden sein, die mdb zu schließen.



Sinnvollerweise sollte eine Jet-Datenbank (*.mdb) beim
Programmstart geöffnet und erst beim Programmende wieder
geschlossen werden.

Freundlicherweise habe ich das Projekt geerbt und keine
(vollstàndige) Dokumentation erhalten.
Meine Frage: Eigentlich ist es doch überhaupt kein Problem
mit mehreren Usern auf eine mdb zuzugreifen. Was mache
ich hier falsch im Code?
-
Sub OpenDB(ByRef db As Object, Optional compress As Boolean)
On Error Resume Next 'Mit Fehlerbehandlung kommt hier natürlich ein Fehler

Dim i As Integer
Dim strErr As String
' Dim FSO As New FileSystemObject -wird nicht mehr gebraucht


For i = 1 To 10
err = 0
Set db = DBEngine.OpenDatabase(DBPath, dbDecrypt, False, ";pwd=" &
pwd)
If err = 0 Then
Exit Sub
End If
strErr = err.description
hLogFile.ErrorLog err.Source, err.number, err.description, "OpenDB"
'wird nicht mehr genützt
' SUR_Pause "1"
Next



Gibt es diese Schleife nur zu Testzwecken, oder was soll diese sonst
bewirken?


End Sub
kann ich beim OpenDatabase einen MultiUser Zugriff erzwingen?



Ja, z.B. so:

Set DB = pWS.OpenDatabase(DBFileName, False, False)

wobei DB die Objektvariable für das DataBase-Objekt ist,
DBFileName den Dateinamen enthàlt,
das erste False bestimmt, dass die *.mdb "NICHT exklusiv" geöffnet wird
und das
zweite False bestimmt, dass die *.mdb "NICHT readonly" geöffnet wird.


Oder sonstwie eine Art fIsDbOpen() einbauen?
Jedesmal bevor ich also den Befehl OpenDB angreife, soll geprüft
werden , ob die Datenbank offen ist, wenn ja dann schließe erst -
dann mach weiter.



s.oben:
Es ist wenig sinnvoll, eine Jet-Datenbank (*.mdb) wàhrend der
Programmlaufzeit stàndig zu öffnen und wieder zu schliessen.

Ein Öffnen im "Nicht exklusiven" Modus (shared) erfordert einen
Schreibzugriff auf die zur *.mdb gehörenden *.ldb oder ein
Neuerstellen dieser *.ldb. Es muss für den ersten Benutzer eine
*.ldb erstellt werden und dann für den jeweiligen Benutzer ein
Eintrag in dieser *.ldb erstellt werden.

Ein Schliessen der DB erfordert wieder einen Schreibzugriff auf
die *.ldb (Löschen des Benutzereintrages) bzw. das Löschen der
*.ldb, wenn der letzte Benutzer die *.mdb schliesst.

Ich denke das müsste irgendwie gehen, aber ich steh gerade
voll auf dem Schlauch.



Wie schon oben gezeigt, wird eine *.mdb so im geteilten
Modus geöffent:

Set DB = pWS.OpenDatabase(DBFileName, False, False)

Was ich genau sagen kann : Auf die Abfrage Teilnehmer und
Messungen kann ich von 5 verschieden Rechnern zugreifen.
Sobald ich aber ins Detail gehe:Eine bestimmte Messung eines
Teilnehmers, sperrt er mir die gesamte DB



Leider kann man aus "eine bestimmte Messung" nicht erkennen,
wie der konkrete Code für diesen DB-Zugriff aussieht.

Ich kann und sollte natürlich den gesamten Code durchsuchen,
aber gibt es eine Möglichkeit mir zu sagen nach welcher/m
Prozedur/sub die DB noch offen ist?



Du kannst z.B. die DB.Name-Eigenschaft abfragen.
Ist die DB geschlossen, löst dies einen Fehler 3420 aus
und damit weist Du, dass die DB eben nicht geöffnet ist.

Ansonsten schau Dir vielleicht auch mal

www.gssg.de -> Visual Basic -> VBclassic
-> Datenbank
-> DAO
-> passwortgeschützte Access.mdb

an.

Gruß aus St.Georgen
Peter Götz
www.gssg.de (mit VB-Tipps u. Beispielprogrammen)

Ähnliche fragen