Re: Zurückschreiben der DB auf die HD
- From: "Peter Götz" <gssg_nospam@xxxxxxxxxxx>
- Date: Wed, 9 Jul 2008 11:18:48 +0200
Hallo Susann,
Mit einem
JRO.JetEngine.RefreshCache Cnn
kannst Du die Jet-Engine zwingen, den Datenpuffer für
das Connectionobjekt Cnn sofort wegzuschreiben.
Dein Vorschlag deckt sich mit dem Vorschlag von Wilfried.
Leider klappt auch das nicht.
Das würde mich aber sehr wundern.
Genau so klappt das bei mir seit vielen, vielen Jahren in
einer ganzen Reihe von Programmen, u.a. auch in einem
Programm, welches auf Messautomaten läuft, die ihre Mess-
daten kontinuierlich in eine gemeinsame *.mdb schreiben.
Einen Datenverlust hat es dabei bisher (ca. 5 Jahre) noch
nie gegeben.
Ich habe den Code wie bei Wilfried 1:1 umgesetzt.
Wenn ich aber nach ca. 2,5 sec den Stecker aus
dem PC ziehe, stehen noch keine Daten in dem
DB-File.
Dann hast Du das "JetEngine.RefreshCache Cnn" ganz
offensichtlich nicht für die Connection ausgeführt, welche
Du auch zum Schreiben Deiner Daten benutzt hast.
Zeige mal den Code, mit welchem Du Deine
Connection zu Deiner *.mdb öffnest.
Ist diese Zeit evtl. auch noch zu kurz?
Nein, ein "JetEngine.RefreshCache Cnn" zwingt die
Jet-Engine, den Datenpuffer für Cnn sofort wegzuschreiben.
Vom absetzen des Statements bis zum Vorhandensein
der Daten in der *.mdb vergehen da nur wenig Millisekunden.
Gibt es eine Möglichkeit der Statusabfrage, ob das
Rückschreiben (Leeren des Caches) erfolgreich war?
Nein, zumindest keine normalen VB-Mittel.
Du kannst aber sicher sein, dass ein
"JetEnginge.RefreshCache Cnn" zuverlässig funktioniert.
Dann könnte ich darauf pollen und solange
warten bis es erfolgreich ist.
Nein, absolut überflüssig. Dein Problem ist ganz
offensichtlich dass Du mindestens zwei Instanzen
von Connectionobjekten hast, vermutlich ohne es
bisher bemerkt zu haben. Über die eine Connection
schreibst/liest Du Deine Daten und für die andere
Connection führst Du den RefreshCache aus.
Schau Dir mal den nachfolgenden Code an:
Private Sub AnySub(FileName As String)
Dim strMsg As String
Set mCnn = New ADODB.Connection
Set mCnnX = New ADODB.Connection
With mCnn
.Provider = "Microsoft.Jet.OLEDB.4.0"
.Properties("Data Source") = FileName
.CursorLocation = adUseClient
.Mode = adModeShareDenyNone
.Open
End With
' ***********************
Set mCnnX = mCnn
' ***********************
MsgBox "mCnn.State: " & CStr(mCnn.State) & _
vbCrLf & _
"mCnnX.State: " & CStr(mCnnX.State), _
vbInformation
If mCnn.State And adStateOpen = adStateOpen Then
mCnn.Close
End If
If mCnnX.State And adStateOpen = adStateOpen Then
mCnnX.Close
End If
End Sub
Die MsgBox zeigt für mCnn.State und für mCnnX.State
jeweils den Wert 1 (adStateOpen), weil es sich in beiden
Fällen um die selbe Connection-Objektinstanz handelt.
Oder anders ausgedrück, beide ObjektVariablen mCnn
und mCnnX verweisen auf ein und das selbe Connection-
objekt.
Und nun zum Vergleich eine nur minimal veränderte
Codevariante:
Private Sub AnySub(FileName As String)
Dim strMsg As String
Set mCnn = New ADODB.Connection
Set mCnnX = New ADODB.Connection
With mCnn
.Provider = "Microsoft.Jet.OLEDB.4.0"
.Properties("Data Source") = FileName
.CursorLocation = adUseClient
.Mode = adModeShareDenyNone
.Open
End With
' ***********************
mCnnX = mCnn
' ***********************
MsgBox "mCnn.State: " & CStr(mCnn.State) & _
vbCrLf & _
"mCnnX.State: " & CStr(mCnnX.State), _
vbInformation
If mCnn.State And adStateOpen = adStateOpen Then
mCnn.Close
End If
If mCnnX.State And adStateOpen = adStateOpen Then
mCnnX.Close
End If
End Sub
Jetzt zeigt die MsgBox für mCnn.State den Wert 1 (adStateOpen)
und für mCnnX.State aber den Wert 0 (adStateClosed). Ein
sicheres Indiz dafür, dass die beiden Objektvariablen
mCnn und mCnnX auf zwei verschiedene Connection-
Objektinstanzen verweisen.
Das fehlende Set vor der Zuweisung
mCnnX = mCnn
hat zur Folge, dass es zwei Connection-Objektinstanzen gibt.
In beiden Beispielen wurden erst mal mit
Set mCnn = New ADODB.Connection
Set mCnnX = New ADODB.Connection
zwei Objektinstanzen erstellt. Danach wird in beiden Fällen
die Instanz auf welche die ObjektVariable mCnn verweist
geöffnet.
Im ersten Beispiel wird nun per
Set mCnnX = mCnn
der Variablen mCnnX ein Verweis auf die bereits geöffnete
erste Instanz übergeben. Die zweite (noch nicht geöffnete)
Instanz hingegen verfällt, da es keinen Verweis mehr auf
diese zweite Instanz gibt.
Im zweiten Beispiel wird per
mCnnX = mCnn
wg des fehlenden "Set" kein Verweis an die Objektvariable
mCnnX übergeben, sondern es wird eine neue Instanz
erstellt, welche die Defaulteigenschaft (ConnectionString)
der ersten Instanz übernimmt. Tatsächlich macht VB in
diesem Fall also sowas:
mCnnX.ConnectionString = mCnn.ConnectionString
Wenn Du nun über mCnn Deine Daten ver-/bearbeitest
und anschliessend einen RefreshCache auf mCnnX machst,
dann hat das für die über mCnn gelaufenen Daten natürlich
keine Auswirkung.
Ich bin ziemlich sicher, dass ein solches vergessenes "Set"
Dein eigentliches Problem ist.
Gruß aus St.Georgen
Peter Götz
www.gssg.de (mit VB-Tipps u. Beispielprogrammen)
.
- Follow-Ups:
- Re: Zurückschreiben der DB auf die HD
- From: Wilfried Dietrich
- Re: Zurückschreiben der DB auf die HD
- References:
- Zurückschreiben der DB auf die HD
- From: Susann Markward
- Re: Zurückschreiben der DB auf die HD
- From: Ralf Brostedt
- Re: Zurückschreiben der DB auf die HD
- From: Susann Markward
- Re: Zurückschreiben der DB auf die HD
- From: Peter Götz
- Re: Zurückschreiben der DB auf die HD
- From: Susann Markward
- Zurückschreiben der DB auf die HD
- Prev by Date: ADO und Access-DB(Abfrage)
- Next by Date: Re: Zurückschreiben der DB auf die HD
- Previous by thread: Re: Zurückschreiben der DB auf die HD
- Next by thread: Re: Zurückschreiben der DB auf die HD
- Index(es):
Relevant Pages
|