Anmelden

View Full Version : Prozessdauer bei Import nach MS Access via ODBC



THK
05-11-08, 10:30
Vorgeschichte:
Ich habe mir ein Modul erstellt, mit welchem ich AS400-Daten über eine SQL-Abfrage in MS Access importiere.
Zunächst wir hierin die Anzahl der Felder und Datensätze ermittelt und abgefragt, ob der Import weiter verfolgt werden soll. Nach Zustimmung werden nach Anlegen der notendigen Access-Tabelle dann die Daten importiert. Derweil zeigt ein Progressbar den Verlauf an.

Nun das Problem:
Manchmal ist der zuvor im Command-Objekt gesetzt Wert für Timeout (SQL0666) zu klein und die Routine wird abgebrochen. Doch auch wenn dieser erhöht wird, dauert es je nach Komplexität der Abfrage einige Zeit, bis es zum Import kommt bzw. überhaupt etwas passiert. Hier könnte zumindest ein Progressbar Aufschluss über den Aktivitätenverlauf geben.

Hier die Frage:
Ist es möglich die zu erwartende Prozessdauer (die wird m.E. in der SQL0666-Meldung angezeigt) zunächst abzufragen um diese dann in einem Progressbar zu verwenden?

Wäre schön wenn hier was gäbe.

Gruß Thomas

Fuerchau
05-11-08, 10:55
Dazu müsstest du den SQL 2 Mal ausführen.
1. CommandTimeout mit 1, Auswerten der Fehlermeldung
2. CommandTimeout mit größerem Wert

Über ADO kannst du den SQL auch asynchron starten, so dass ein Weiterarbeiten möglich ist.
Über das Recordset.State kannst du abfragen, ob der Execute ggf. noch läuft.

Über die Cancel-Eigenschaft kannst du (zumindest bei der AS/400) den laufenden Befehl sogar abbrechen.

Das Connection-Object liefert über ein Ereignis, dass der SQL fertig ist und die daten abgeholt bzw. verarbeitet werdn können (je nach Cursorart).

THK
05-11-08, 14:43
Danke!
Damit mit der Auswertung der Fehlermeldung ist eine gute Lösung. Der zusätzliche SQL nimmt nicht sonderlich viel Zeit in Anspruch und durch das CommandTimeout= 1 ist die Fehlermeldung ruckzuck da!

Aber kannst du das asynchrone Starten näher beschreiben?

Könnte dies so lauten:


Dim AS400Connect As New ADODB.Connection
Dim AS400Command As New ADODB.Command
Dim AS400Record As New ADODB.Recordset

CommString = "Select * FROM DCWD.KBEWKO WHERE KBKST<>'99999' Order BY KBBTX "

With AS400Connect
.ConnectionString = "DSN=THK-Bibliothek"
.Open "DSN=THK-Bibliothek", Benutzerkennung, Passwort
end with

With AS400Command
.CommandText = CommString
.CommandTimeout = 500
Set .ActiveConnection = AS400Connect
End With

AS400Record .StayInSync = False
AS400Record .Open AS400Command
...


Gruß Thomas

Fuerchau
05-11-08, 15:14
' Ereignisse der Verbindung
Dim WithEvents cLocalWait As ADODB.Connection ' Warten auf Fertigstellung

:
:
With xRecord
.CursorLocation = adUseClient ' lokal Cache
.CursorType = adOpenStatic
.LockType = adLockBatchOptimistic
.CacheSize = 10000
.Open xSQL, cLocal, , , adAsyncExecute Or adAsyncFetch

Do While True
Select Case True
Case Is = (.State And adStateExecuting) = adStateExecuting
DoEvents
Case Else
Exit Do
End Select
Loop

End With
:
:
Private Sub cLocalWait_ExecuteComplete(ByVal RecordsAffected As Long, ByVal pError As ADODB.Error, adStatus As ADODB.EventStatusEnum, ByVal pCommand As ADODB.Command, ByVal pRecordset As ADODB.Recordset, ByVal pConnection As ADODB.Connection)
' Behandlung des Ereignisses
If Not pError Is Nothing Then
' Fehler passiert
End If
End Sub

THK
05-11-08, 16:12
Bei mir läuft die Schleife endlos obwohl .State und adStateExecuting den Wert 4 haben!

Welche Werte kann denn .State überhaupt haben?

Fuerchau
06-11-08, 12:33
Auf MSDN gibts eine Beschreibung zu ADO.
Du wirst auch fündig in "C:\WinVerz\HELP\ADO210.CHM". Die Doku ist immer noch weitgehend gültig.

adStateExecuting hat ja den Wert 4.