Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

Fehler beim komprimieren, da Datenbank exclusive geöffnet

132 views
Skip to first unread message

Gerhard Förster

unread,
May 22, 2012, 9:06:49 AM5/22/12
to
Hallo und moin Moin,

Beim komprimieren einer externen Datenbank kommt bei mir die Meldung:

Ausnahmenummer 3356; d.h. Sie haben versucht eine DB zu öffnen, die bereits exclusive vom Benutzer "admin" auf dem computer geöffnet ist. Versuchen Sie es noch einmal, wenn die DB verfügbar ist.

In der Routine zum komprimieren schließe ich zuerst alle Objekte
Call CloseAllOpenObjects(True)
beende gelinkten Tabellen
TBL_DisConnect
schließe danch die Datenbank
Set DB1 = CurrentDb
DB1.Close
Set DB1 = Nothing

und rufe die Funktion zum Komprimieren
CompactBackendDB (s1) / S1=Pfad und Name der DB

Und hier kommt es dann zum Fehler.
Wie erreiche ich es, dass die DB nicht mehr exlusiv geöffnet ist.

Danke im Voraus
Gruß - Gerhard



Karl Donaubauer

unread,
May 25, 2012, 12:49:17 PM5/25/12
to
Gerhard Förster wrote:
> Beim komprimieren einer externen Datenbank kommt bei mir die Meldung:
>
> Ausnahmenummer 3356; d.h. Sie haben versucht eine DB zu öffnen, die
> bereits exclusive vom Benutzer "admin" auf dem computer geöffnet ist.
> Versuchen Sie es noch einmal, wenn die DB verfügbar ist.
>
> In der Routine zum komprimieren schließe ich zuerst alle Objekte
> Call CloseAllOpenObjects(True)
>
> beende gelinkten Tabellen
> TBL_DisConnect
>
> schließe danch die Datenbank
> Set DB1 = CurrentDb
> DB1.Close
> Set DB1 = Nothing

Das bringt aus mind. 2 Gründen nichts:
Du willst ja nicht die aktuelle DB komprimieren sondern eine andere.
Currentdb kann man nicht schließen. Access schluckt nur lautlos
den Fehler bei diesem Close-Versuch.

> und rufe die Funktion zum Komprimieren
> CompactBackendDB (s1) / S1=Pfad und Name der DB
>
> Und hier kommt es dann zum Fehler.
> Wie erreiche ich es, dass die DB nicht mehr exlusiv geöffnet ist.

Hast du nachgesehen, ob nach deinen obigen Prozeduren noch
eine ldb der zu komprimierenden DB existiert?

Falls ja: Ist diese ldb weg, wenn du die aktuelle DB beendest?

Wenn wieder ja: Du hast noch mind. eine Referenz auf diese DB
offen. Wo, kann man schwer sagen, ohne deine Anwendung,
deine Verbindungen zur anderen DB und deinen Code zu kennen.

Wir sehen ja nicht, wie CloseAllOpenObjects, TBL_DisConnect
(klingt besonders gefährlich ;-) und CompactBackendDB aussehen.

--
Servus
Karl
*********
Access-FAQ: http://www.donkarl.com


Gerhard Förster

unread,
May 30, 2012, 6:09:37 AM5/30/12
to
On 25 Mai, 18:49, "Karl Donaubauer" <NoS...@donkarl.com> wrote:
> Gerhard Förster wrote:
> > Beim komprimieren einer externen Datenbank kommt bei mir die Meldung:
>
> > Ausnahmenummer 3356; d.h. Sie haben versucht eine DB zu öffnen, die
> > bereits exclusive vom Benutzer "admin" auf dem computer geöffnet ist.
> > Versuchen Sie es noch einmal, wenn die DB verfügbar ist.
>
> > In der Routine zum komprimieren schließe ich zuerst alle Objekte
> >       Call CloseAllOpenObjects(True)
>
> > beende gelinkten Tabellen
> >       TBL_DisConnect
>
> > schließe danch die Datenbank
> >       Set DB1 = CurrentDb
> >       DB1.Close
> >       Set DB1 = Nothing
>
> Das bringt aus mind. 2 Gründen nichts:
> Du willst ja nicht die aktuelle DB komprimieren sondern eine andere.
> Currentdb kann man nicht schließen. Access schluckt nur lautlos
> den Fehler bei diesem Close-Versuch.
Das ist mir jetzt auch klar
>
> > und rufe die Funktion zum Komprimieren
> >       CompactBackendDB (s1)  / S1=Pfad und Name der DB
>
> > Und hier kommt es dann zum Fehler.
> > Wie erreiche ich es, dass die DB nicht mehr exlusiv geöffnet ist.
>
> Hast du nachgesehen, ob nach deinen obigen Prozeduren noch
> eine ldb der zu komprimierenden DB existiert?
>
> Falls ja: Ist diese ldb weg, wenn du die aktuelle DB beendest?
>
> Wenn wieder ja: Du hast noch mind. eine Referenz auf diese DB
> offen. Wo, kann man schwer sagen, ohne deine Anwendung,
> deine Verbindungen zur anderen DB und deinen Code zu kennen.
>
> Wir sehen ja nicht, wie CloseAllOpenObjects, TBL_DisConnect
> (klingt besonders gefährlich ;-) und CompactBackendDB aussehen.
>
> --
> Servus
> Karl
> *********
> Access-FAQ:http://www.donkarl.com

Hallo Karl,
danke für die Antwort.
Ja, es ist so. Nach dem Abarbeiten der Funktionen
Call CloseAllOpenObjects(True)
TBL_DisConnect
ist noch eine LDB-Datei der benutzten DB offen.
Nach dem Schließen der DB ist dies dann auch weg.

Beim "CloseAllOpenObject" arbeite ich folgenden Code ab:
Public Sub CloseAllOpenObjects(pbWarnung As Boolean)

Dim dbs As DAO.Database
Dim objTmp As Object
Dim sName As String

On Error GoTo CloseAllOpenObjects_Err

Set dbs = CurrentDb()

' Schleife über alle Tabellen
For Each objTmp In dbs.TableDefs
sName = objTmp.name
If IsObjectOpen(acTable, sName) Then
DoCmd.Close acTable, sName
End If
Next objTmp

Und diese obige Schleife dann sinngemäß über alle
- Abfragen
- Formulare
- Reports
- Makros
- Module
- ADPs
Damit sollten doch alle Elemente geschlossen werden. Oder übersehe ich
da was?

in TBL_Disconnect steht folgendes
Function TBL_DisConnect()
Dim tdf As TableDef
Dim TBL_Name As String
Set DB1 = CurrentDb()
For Each tdf In DB1.TableDefs
TBL_Name = tdf.name
If TBL_Connected("", TBL_Name) Then
DoCmd.DeleteObject acTable, TBL_Name
End If
Next
Set DB1 = Nothing
End Function

Die Funktion CompactBackendDB (name) habe ich von Deiner Access-FAQ
Seite.

Wenn Du mir hier weiterhelfen könntest, bin ich Dir sehr dankbar, da
mir das Problem ziehmlich unter den Nägeln brennt.

Danke im Voraus - Gruß Gerhard






Karl Donaubauer

unread,
May 30, 2012, 1:08:53 PM5/30/12
to
Hallo, Gerhard!

Gerhard F锟絩ster wrote:
> ...
> Beim "CloseAllOpenObject" arbeite ich folgenden Code ab:
> Public Sub CloseAllOpenObjects(pbWarnung As Boolean)
>
> Dim dbs As DAO.Database
> Dim objTmp As Object
> Dim sName As String
>
> On Error GoTo CloseAllOpenObjects_Err
>
> Set dbs = CurrentDb()
>
> ' Schleife 锟絙er alle Tabellen
> For Each objTmp In dbs.TableDefs
> sName = objTmp.name
> If IsObjectOpen(acTable, sName) Then
> DoCmd.Close acTable, sName
> End If
> Next objTmp
>
> Und diese obige Schleife dann sinngem锟斤拷 锟絙er alle
> - Abfragen
> - Formulare
> - Reports
> - Makros
> - Module
> - ADPs
> Damit sollten doch alle Elemente geschlossen werden. Oder 锟絙ersehe ich
> da was?

Joo, Vorw锟絩ts-Schleifen durch Auflistungen 锟絙erholen sich gerne selbst,
und dann bleiben Objekte offen. Du musst r锟絚kw锟絩ts durch.
Hier ein Beispiel f锟絩 die Forms-Auflistung:

http://groups.google.com/group/microsoft.public.de.access/browse_frm/thread/2719e380b5416b8

Was meinst du denn mit "ADPs" ?

> - Makros
> - Module

bringt nix. Kannst du bleiben lassen.
Wichtig ist, dass alle DAO- oder ADO-Recordsets auf eingebundene
Tabellen oder mit sonstigem Bezug zum BE geschlossen sind.

> ... For Each tdf In DB1.TableDefs
> TBL_Name = tdf.name
> If TBL_Connected("", TBL_Name) Then
> DoCmd.DeleteObject acTable, TBL_Name
> ...

Eingebundene Tabellen brauchst du nicht zu l锟絪chen. Sie m锟絪sen nur
geschlossen sein.

Gerhard Förster

unread,
Jun 5, 2012, 3:01:02 PM6/5/12
to
Hallo Karl,
Danke für Deien Beitrag.
Ich habe jetzt, Deinem Rat folgend alle Objekte "rückwärts"
geschlossen.
Dazu folgender Code:

Set dbs = CurrentDb()
' Schleife alle Tabellen schließen
For Each objTmp In dbs.TableDefs
sName = objTmp.name
If IsObjectOpen(acTable, sName) Then
DoCmd.Close acTable, sName
End If
Next objTmp
' Schleife alle Abfragen schließen - rückwärts
For i = dbs.QueryDefs.Count - 1 To 0 Step -1
DoCmd.Close acQuery, dbs.QueryDefs(i).name
Next i
' Schleife alle Formulare schließen - rückwärts
For i = Forms.Count - 1 To 0 Step -1
DoCmd.Close acForm, Forms(i).name
Next i
' Schleife alle Reports schließen - rückwärts
For i = Reports.Count - 1 To 0 Step -1
DoCmd.Close acReport, Reports(i).name
Next i
' Schleife alle Module schließen
For i = Modules.Count - 1 To 0 Step -1
DoCmd.Close acModule, Modules(i).name
Next i


Trotdem ist nach dem Abarbeiten die LDB-Datei immer noch vorhanden.
und der Fehler 3356 (DB exclusive geöffnet) tritt weiterhin beim
komprimieren auf.

Habe ich da noch irdendwas vergessen (Makros gibt es inder Anwendung
nicht) ?

Hast Du noch einen Tip?

Danke und Gruß Gerhard

Gerhard Förster

unread,
Jun 5, 2012, 3:24:36 PM6/5/12
to
Hallo Karl,

noch ´ne andere Frage.
Spricht eigentlich etwas dagegen, wenn ich die Backend DB beim
Starten, also vor den öffnen komprimiere und dann mit der
komprimierten Datei arbeite?

Dann funktioniert dieser Aufruf "CompactBackendDB (name)" ohne
Probleme.

Gruß Gerhard

Karl Donaubauer

unread,
Jun 6, 2012, 1:37:41 PM6/6/12
to
Gerhard F�rster wrote:
> ...
> ' Schleife alle Module schlie�en
> For i = Modules.Count - 1 To 0 Step -1
> DoCmd.Close acModule, Modules(i).name
> Next i

Wie schon geschrieben, ist das Schlie�en von Modulen sinnlos
in Hinblick auf das Problem.

> Trotdem ist nach dem Abarbeiten die LDB-Datei immer noch vorhanden.
> und der Fehler 3356 (DB exclusive ge�ffnet) tritt weiterhin beim
> komprimieren auf.
>
> Habe ich da noch irdendwas vergessen (Makros gibt es inder Anwendung
> nicht) ?
> ...

Eine h�ufige Ursache sind nicht geschlossene DAO-Recordsets.
Ob das in deiner DB m�glich ist, kannst nur du wissen.

Wenn man die Anwendung nicht kennt, kann man abseits der
Standardtipps halt nur herumraten.

Karl Donaubauer

unread,
Jun 6, 2012, 1:40:12 PM6/6/12
to
Gerhard F�rster wrote:
> ....
> Spricht eigentlich etwas dagegen, wenn ich die Backend DB beim
> Starten, also vor den �ffnen komprimiere und dann mit der
> komprimierten Datei arbeite?
>
> Dann funktioniert dieser Aufruf "CompactBackendDB (name)" ohne
> Probleme.

Naja, ich w�rde ein Backend im Normalfall nicht automatisch
komprimieren sondern nur auf expliziten Befehl hin, denn beim
Komprimieren kann immer etwas schief gehen: z.B. im
Mehrbenutzerbetrieb jmd. anderer drin h�ngen und schon
grunds�tzlich k�nnen Fehler beim Komprimier-Versuch
oder -Vorgang passieren.

Gerhard Förster

unread,
Jun 7, 2012, 1:36:36 AM6/7/12
to
On 6 Jun., 19:40, "Karl Donaubauer" <nos...@donkarl.com> wrote:

> Naja, ich w rde ein Backend im Normalfall nicht automatisch
> komprimieren sondern nur auf expliziten Befehl hin, denn beim
> Komprimieren kann immer etwas schief gehen: z.B. im
> Mehrbenutzerbetrieb jmd. anderer drin h ngen und schon
> grunds tzlich k nnen Fehler beim Komprimier-Versuch
> oder -Vorgang passieren.
>

Danke - Gruß Gerhard

Gerhard Förster

unread,
Jun 7, 2012, 1:55:17 AM6/7/12
to
On 6 Jun., 19:37, "Karl Donaubauer" <nos...@donkarl.com> wrote:
Hallo Karl,

> Eine h ufige Ursache sind nicht geschlossene DAO-Recordsets.
> Ob das in deiner DB m glich ist, kannst nur du wissen.
>
> Wenn man die Anwendung nicht kennt, kann man abseits der
> Standardtipps halt nur herumraten.

Ich öffne ich meine Recordsets immer mit der Anweisung:
set rs = correntdb.openrecordset .....
...
...
und schließe diese mit
rs.close
set rs=nothing

Kann sein dass das irgenwo mal vergessen wurde.
Gibt es da auch ´ne Möglichkeit in Form einer Schleife, per VBA,
offene Recordsets zu finden und diese zu schließen?

Danke - Gruß Gerhard
0 new messages