Re: Datenbank kopieren / Fehlermeldung
- From: Peter Götz <gssg_nospam@xxxxxxxxxxx>
- Date: Sun, 12 Mar 2006 11:13:48 +0100
Hallo Knut,
Vielen Dank für die Tips und Kommentare. Ich habe heute experimentiert.
Leider habe ich dazu noch immer VB 5 (DAO).
Wenn Du DAO verwendest dann hast Du vermutlich mehrere DAO-DataControls
(DATA) und ohne es zu wissen, mehrere geöffnete DataBase-Objekte.
Du musst in Deinem Programmcode alle DAO.DataBase-Objekte schliessen und
erst dann kannst Du die *.mdb kopieren. Wenn Du mehrere Data-Controls in
Deinem Projekt hast, dann verwaltet jedes dieser DataControls ein
DataBase-Objekt, sofern Du nicht durch speziellen Code dafür gesorgt hast,
dass alle DataControls auf ein gemeinsames DataBase-Objekt verweisen.
Solange auch nur noch ein einziges geöffnetes DAO.DataBase-Objekt welches
auf Deine *.mdb verweist vorhanden ist, ist die Datei gesperrt. Du siehst
das daran, dass dei *.ldb einen noch einen entsprechenden Benutzereintrag
enthält und natürlich auch daran, dass Du die *.mdb nicht kopieren kannst.
Wenn das letzte DataBase-Objekte geschlossen wird, wird der letzte
Benutzereintrag in der *.ldb gelöscht und die gesamte *.ldb wird ebenfalls
gelöscht.
Hier mal ein kleines Beispiel, mit welchem Du beobachten kannst, wie die
DataBase-Objekte mehrerer DAO-DataControls aussehen und auch wie erst nach
dem Schliessen des letzten DataBaseObjektes die *.ldb verschwindet.
' 1 Form: Form1
' mit 1 DAO-DataControl: Data1
1 DAO-DataControl: Data2
1 CommandButton: Commmand1
1 CommandButton: Command2
Den beiden DataControls weist Du zur Entwicklungszeit bereits über die
Eigenschaft "DataBaseName" jeweils die selbe *.mdb zu.
' /// Code in Form1
Option Explicit
Dim DB1 As DAO.Database
Dim DB2 As DAO.Database
Private mLoading As Boolean
Private Sub Form_Activate()
If mLoading Then
Set DB1 = Data1.Database
Set DB2 = Data2.Database
mLoading = False
End If
End Sub
Private Sub Form_Load()
mLoading = True
End Sub
Private Sub Command1_Click()
Data1.Database.Close
End Sub
Private Sub Command2_Click()
Data2.Database.Close
End Sub
Private Sub Form_Click()
Stop
End Sub
' \\\ E N T E
Nach dem Programmstart hält ein Klick auf die Form1 per Stop-Anweisung die
Programmausführung an und nun kannst Du Dir im Überwachungsfenster z.B. die
beiden DataBase-Objekte DB1 und DB2 ansehen.
Mit F5 lässt Du das Programm weiterlaufen.
Im Windowsexplorer siehst Du neben Deiner *.mdb auch eine *.ldb.
Ein Mausklick auf den Button Command1 schliesst das erste zu DATA1 gehörende
DataBase-Objekt, die *.ldb ist weiter vorhanden.
Ein weiterer Mausklick auf den Button Command2 schliesst das zweite zu Data1
gehörende DataBase-Objekt.
Nachdem nun beide DataBase-Objekte geschlossen sind, ist die *.mdb wieder
frei und im Windows-Explorer verschwindet nun auch die *.ldb.
Das Problem mit den mehreren DataBase-Objekten kannst Du umgehen, wenn Du
Deinen DataControls zur Entwurfszeit noch keine Datenbank (DataBaseName)
zuweist.
Du öffnest dann zur Laufzeit per Code ein Workspace-Objekt, öffnest darauf
ein einziges DataBase-Objekt und erstellst auf diesem DataBase-Objekt alle
benötigten Recordsetobjekte. Diese Recordsetobjekte weist Du dann jeweils
der .Recordset - Eigenschaft Deiner DataControls zu.
Beispiel:
1 Form: Form1
mit 1 DAO.DataControl: Data1
1 DAO.DataControl: Data2
1 CommandButton: Command1
' Zur Entwurfszeit werden keinerlei Eigenschaften der beiden DataControls
eingestellt.
' /// Code in Form1
Option Explicit
Private mWS As DAO.Workspace
Private mDB As DAO.Database
Private mRS1 As DAO.Recordset
Private mRS2 As DAO.Recordset
Private Sub Form_Load()
Dim strBuffer As String
strBuffer = "D:\Arb_VB6\ADODemoMU_2002_Arb\DataBase\db2002.mdb"
Set mWS = Workspaces(0)
Set mDB = mWS.OpenDatabase(strBuffer, False, False)
strBuffer = "Select * From Tabelle"
Set mRS1 = mDB.OpenRecordset(strBuffer, dbOpenDynaset)
Set Data1.Recordset = mRS1
strBuffer = "Select * From Tabelle"
Set mRS2 = mDB.OpenRecordset(strBuffer, dbOpenDynaset)
Set Data2.Recordset = mRS2
End Sub
Private Sub Command1_Click()
mRS1.Close
mRS2.Close
mDB.Close
End Sub
' \\\ E N T E
In Form_Load wird nun erst ein Workspace-Objekt definiert [Workspaces(0)]
auf welchem dann ein einziges DAO.DataBase-Objekt (mDB) erstellt wird.
Auf diesem DataBase-Objekt mDB werden nun zwei Recordsets erstellt und den
beiden DataControls jeweils eines dieser Recordsets via
Set DataControlx.Recordset = mRSx
zugewiesen.
Nun hast Du trotz mehrerer DataControls nur ein einziges gemeinsames
DataBase-Objekt und kannst dieses mit einem Mausklick auf den Button
Command1 schliessen.
Nach dem Programmstart kannst Du im Windows-Explorer wieder sehen, dass eine
*.ldb erstellt worden ist.
Mit dem Klick auf Command1 wird das einzige DataBase-Objekt geschlossen und
die *.ldb verschwindet.
Gruß aus St.Georgen
Peter Götz
www.gssg.de (mit VB-Tips u. Beispielprogrammen)
.
- Follow-Ups:
- Re: Datenbank kopieren / Fehlermeldung
- From: knut Peters
- Re: Datenbank kopieren / Fehlermeldung
- References:
- Datenbank kopieren / Fehlermeldung
- From: knut Peters
- Re: Datenbank kopieren / Fehlermeldung
- From: Thorsten Doerfler
- Re: Datenbank kopieren / Fehlermeldung
- From: knut Peters
- Re: Datenbank kopieren / Fehlermeldung
- From: Peter Götz
- Re: Datenbank kopieren / Fehlermeldung
- From: knut Peters
- Datenbank kopieren / Fehlermeldung
- Prev by Date: Re: Datentyp von Err / Datei öffnen und in einer Subroutine reinschreiben
- Next by Date: Re: Selbstextrahierende Exe
- Previous by thread: Re: Datenbank kopieren / Fehlermeldung
- Next by thread: Re: Datenbank kopieren / Fehlermeldung
- Index(es):