Re: Zurückschreiben der DB auf die HD

Tech Tip: Click here to run a free scan for Windows Errors and optimize PC performance



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)











.



Relevant Pages