2009-07-28 2 views
1

Ich arbeite an einem Programm, das einige Objekte in einer Access-Datenbank bearbeiten muss. Es wird auch ein Unterprogramm (Longstory) ausgeführt, das versucht, auf die zugrunde liegende JET-Datenbank zuzugreifen, während Access es weiterhin über ODBC geöffnet hat.Wie kann ich eine Access-Datenbank zwischen dem gemeinsamen und dem exklusiven Modus wechseln?

Das Problem ist, dass, sobald ich anfange, Formularobjekte mit VBA zu bearbeiten - zum Beispiel mit Application.LoadFromText - Access ändert die Datenbank in den exklusiven Modus. Exclusive-Modus ist in Ordnung, und ich weiß, warum es es braucht. Aber ich muss danach wieder in den "geteilten" Modus wechseln können, damit ich mein Unterprogramm ausführen kann.

Ich habe beobachtet, dass Access, wenn Sie die Benutzeroberfläche verwenden, um ein Formular im Entwurfsmodus zu öffnen, die Datenbank auf Exklusiv umschaltet. (Sie können dies bestätigen, indem Sie versuchen, es von einem anderen Computer aus zu öffnen.) Wenn Sie dann den Formular-Designer schließen, wird er jedoch sofort wieder in den freigegebenen Modus versetzt, was ich mir erhofft habe.

Gibt es eine Möglichkeit, es mit VBA/COM-Anrufen selbst hin und her zu schalten?

Ich weiß, ich kann Application.CloseCurrentDatabase() gefolgt von OpenCurrentDatabase(), aber das schließt alle Fenster und stört die Benutzeroberfläche, so ist es nicht ideal.

+0

Ich fand eine Abhilfe: Öffnen Sie ein beliebiges Formular und schließen Sie es dann. Dies scheint Access zu überdenken, ob die Datenbank im exklusiven Modus bleiben muss oder nicht. Das ist jedoch ziemlich eklig. – apenwarr

+0

Ihre Frage ist verwirrend, da Access mit ODBC keine Verbindung zu seinen eigenen Datendateien (Jet/ACE) herstellen kann. –

+0

Richtig, mein Unterprogramm ist eigentlich in C++ geschrieben. Solange Access die MDB-Datei nicht geöffnet hat oder im freigegebenen Modus geöffnet ist, kann das C++ - Programm problemlos über ODBC manipuliert werden. (Und es ist etwa 10x schneller als mit DAO oder ADO, oder wir würden nur die DAO-Verbindung aus der offenen Access-Datenbank ausleihen.) – apenwarr

Antwort

5

Aufteilung der Datenbank in ein separates Frontend mit den Forms/Modulen/etc. und Back-End mit den Tabellen eine Option? Auf diese Weise ist das Back-End immer noch zugänglich, wenn das Frontend gesperrt ist. Access verfügt über einen Datenbanksplitting-Assistenten für genau diesen Zweck.

+0

Das ist eine Option - und einige Datenbanken, in denen ich das tun, sind tatsächlich auf diese Weise aufgeteilt - aber es ist nicht -Ideal. Ich muss keine Operationen ausführen *, während * es gesperrt ist, ich muss nur bei Bedarf sperren und entsperren können. – apenwarr

+0

Splitting ist die einzig vernünftige Antwort. –

+0

Wenn das stimmt, dann ist es traurig. Die fraglichen Datenbanken sind klein und einfach, und es ist eine Schande, sie wegen eines trivialen Locking-Problems zu spalten. – apenwarr

0

Sie könnten .UserControl und .Visible versuchen. Ich verwende sie, um die Kontrolle in automatisierten Prozessen zu übertragen. Ich weiß nicht, ob sie hier helfen werden, aber Sie können abstimmen, wenn sie es nicht tun.

+0

Ich bin mir nicht sicher, ob das etwas nützt. Die Datenbank wird exklusiv geöffnet. Das hält die VBA-App nicht davon ab, sie zu steuern. – apenwarr

Verwandte Themen