Forums Neueste Beiträge
 

Frage: ADO Connection Object

16/10/2007 - 13:56 von Georg Höfler | Report spam
Hallo NG,

ich möchte gerne Daten von einer Datenbank(Access) in eine andere
Datenbank(Access) übernehmen und diese dann dort weiterverarbeiten. Dazu
mache ich am Anfang der Routine die Connections zu den beiden
Datenbanken auf, dann verschiebe ich die Datensàtze mittels eines
Commands (INSERT INTO, ausgeführt vom Connection Object der
Quelldatenbank) in eine temporàre Tabelle der Zieldatenbank. Beim
weiterverarbeiten ist mir aufgefallen, das ganze nicht sauber
funktioniert. Ich denke es liegt daran, dass das Connection Object die
Daten nicht gleich rausschreibt, oder so etwas in der Art, da diesen das
ganze Funktioniert, wenn ich im Debug-Modus zwischen diesen Punkten
anhalte und mit die Tabelleninhalte anschaue. Wenn ich die Connection
der QuellDB schliesse und die Connection der ZielDB erst öffne, nachdem
ich das 'Insert Into' ausgeführt habe, dann funktioniert es ebenfalls.

Vielleicht kann mir einer sagen woran das genau liegt. Falsche/fehlende
Einstellungen beim Connection Object? Ich hab schon gesucht, finde aber
einfach nix.

Die Connection's Strings sehen so aus:
m_conDB.Open "PROVIDER=Microsoft.Jet.OLEDB.4.0;Data Source=" & sDB & ";"


Der Code sieht vom Prinzip her folgendermaßen aus (Fehlerroutinen usw.
alles mal außen vor):

'Daten von DB1 nach DB2 schaufeln
m_conDB1.BeginTrans
sCommand = "INSERT INTO TabelleTmp_DB2 IN '' [MS Access;DATABASE="
& sPfadDB2 & " SELECT * FROM Tabelle1_DB1"
m_conDB1.Execute sCommand, , adExecuteNoRecords
m_conDB1.CommitTrans

'Daten in DB2 veràndern + in eine andere Tabelle von DB2 schreiben
'Nummer um 1000 erhöhen
m_conDB2.BeginTrans
sCommand = "UPDATE TabelleTmp_DB2 SET Nummer = Nummer + 1000)"
m_conDB2.Execute sCommand, , adExecuteNoRecords
m_conDB2.CommitTrans

'Datensàtze in andere Tabelle verschieben
m_conDB2.BeginTrans
sCommand = "INSERT INTO Tabelle1_DB2 SELECT * FROM TabelleTmp_DB2"
m_conDB2.Execute sCommand, , adExecuteNoRecords
m_conDB2.CommitTrans


Bis dann
Georg
 

Lesen sie die antworten

#1 Peter Götz
02/11/2007 - 11:25 | Warnen spam
Hallo Georg,

ich möchte gerne Daten von einer Datenbank(Access)
in eine andere Datenbank(Access) übernehmen und diese dann dort
weiterverarbeiten. Dazu mache ich am Anfang der Routine die Connections zu
den beiden Datenbanken auf, dann verschiebe ich die Datensàtze mittels
eines Commands (INSERT INTO, ausgeführt vom Connection Object der
Quelldatenbank) in eine temporàre Tabelle der Zieldatenbank. Beim
weiterverarbeiten ist mir aufgefallen, das ganze nicht sauber
funktioniert.



Was genau verstehst Du unter

"nicht sauber funktioniert"?

Ich denke es liegt daran, dass das Connection Object die Daten nicht
gleich rausschreibt, oder so etwas in der Art, da diesen das ganze
Funktioniert, wenn ich im Debug-Modus zwischen diesen Punkten anhalte und
mit die Tabelleninhalte anschaue. Wenn ich die Connection der QuellDB
schliesse und die Connection der ZielDB erst öffne, nachdem ich das
'Insert Into' ausgeführt habe, dann funktioniert es ebenfalls.



Das hat etwas mit dem Caching der Jet-Engine zu tun.
Die Jet-Engine schreibt neue/geànderte Daten nicht sofort
in die phys. DB (z.B. auf der Platte) sondern erst mal in
einen Datenpuffer. Erst wenn Windows und ADO nichts
wichtigeres zu tun haben, werden die Daten aus diesem
Puffer in die phys. DB geschrieben. Dabei kann es
Verzögerungen bis zu mehreren Sekunden geben.
Mit

JRO.JetEngine.RefreshCache CNN

(Cnn ist Dein Connectionobjekt) kannst Du die Jet-
Engine zwingen, die Daten aus dem Puffer sofort in
die DB zu schreiben.
Der Puffer wird auch, wenn Du Deine Aktionen in eine
Transaktion verpackst, mit dem Commit weggeschrieben.


Vielleicht kann mir einer sagen woran das genau liegt.



s.oben:
Caching der Jet-Engine u. Jro.JetEngine.RefreshCache

Falsche/fehlende Einstellungen beim Connection Object?
Ich hab schon gesucht, finde aber einfach nix.



Du findest das in der OH zu Jro.JetEngine.

Die prakt. Anwendung von Jro.JetEngine siehst Du
auch im Beispiel

www.gssg.de -> Visual Basic -> VBclassic
-> Datenbank -> ADO DemoMU 2002

In diesem Beispiel gibt es ein Klassenmodul clsGSADOData
und darin die Function RSUpdate() in welcher Du eine
Codezeile

mvarJetEng.RefreshCache cnn

findest.

Gruß aus St.Georgen
Peter Götz
www.gssg.de (mit VB-Tipps u. Beispielprogrammen)

Ähnliche fragen