1m10sec für 10000 Punkte

Hi
wollte mal fragen, ob es normal ist, das es solange dauerd eine Punktdatei in
eine Access-Datenbank einzubinden.
Man muß noch dazu sagen, das ich die Datei zeilenweise einlese und den String
in Teilstrings aufgliedere, damit ich die Daten formatiert in die Zellen der Datenbnak bekomme.
Ausserdem läuft noch eine Progressbar mit, welche den Einlesefortschritt angibt.

Vielleicht kann jmd dazu sein Statement geben.
Ich wüßte nicht wie man das noch verbessern kann.
Die For-Next oder Do-Loop Schleifen brauche ich alle.

Mfg Werner

Hi werner,

Die For-Next oder Do-Loop Schleifen brauche ich alle.

Naja, um das zu beurteilen bräuchte ich ne Glaskugel :smile:

Nachfolgend habe ich einen VBA-Code (von einem VB-Forum zusammengebastelt) der eine Html-Datei am Stück einliest und in eine Textdatei schreibt, Er ist sehr schnell. Vielleicht kannst du Teile davon gebrauchen. Sub test() musste dir anpassen.
Gruß
Reinhard

Private Declare Sub InternetCloseHandle Lib "wininet.dll" ( \_
 ByVal hInet As Long)
Private Declare Function InternetOpenA Lib "wininet.dll" ( \_
 ByVal sAgent As String, ByVal lAccessType As Long, \_
 ByVal sProxyName As String, ByVal sProxyBypass As String, \_
 ByVal lFlags As Long) As Long
Private Declare Function InternetOpenUrlA Lib "wininet.dll" ( \_
 ByVal hOpen As Long, ByVal sUrl As String, \_
 ByVal sHeaders As String, ByVal lLength As Long, \_
 ByVal lFlags As Long, ByVal lContext As Long) As Long
Private Declare Sub InternetReadFile Lib "wininet.dll" ( \_
 ByVal hFile As Long, ByVal sBuffer As String, \_
 ByVal lNumBytesToRead As Long, lNumberOfBytesRead As Long)

'Enumeration für Internet:
Public Enum InternetOpenType
 IOTPreconfig = 0
 IOTDirect = 1
 IOTProxy = 3
End Enum
Sub test()
Dim s As String, n As Integer
For n = 1 To 7
 s = OpenURL(Range("B" & n).Value)
 WriteFile Range("a" & n).Value, s
Next n
End Sub
Public Function FileExists(Path As String) As Boolean
 Const NotFile = vbDirectory Or vbVolume

 On Error Resume Next
 FileExists = (GetAttr(Path) And NotFile) = 0
 On Error GoTo 0
End Function
Function ReadFile(ByRef Path As String) As String
 Dim FileNr As Long

 'Falls nicht vorhanden, nichts zurückgeben:
 On Error Resume Next
 If FileLen(Path) = 0 Then Exit Function
 On Error GoTo 0

 'Datei einlesen:
 FileNr = FreeFile
 Open Path For Binary As #FileNr
 ReadFile = Space$(LOF(FileNr))
 Get #FileNr, , ReadFile
 Close #FileNr
End Function

Sub WriteFile(ByRef Path As String, ByRef Text As String)
 Dim FileNr As Long

 'Wenn Datei unverändert, dann abbrechen (ggf. weglassen):
 If FileExists(Path) Then \_
 If FileLen(Path) = Len(Text) Then \_
 If ReadFile(Path) = Text Then Exit Sub

 'Text speichern:
 FileNr = FreeFile
 Open Path For Output As #FileNr
 Print #FileNr, Text;
 Close #FileNr
End Sub


Public Function OpenURL( \_
 ByVal URL As String, \_
 Optional ByVal OpenType As InternetOpenType = IOTPreconfig \_
 ) As String
 Const INET\_RELOAD = &H80000000
 Dim hInet As Long
 Dim hURL As Long
 Dim Buffer As String \* 2048
 Dim Bytes As Long

 'Inet-Connection öffnen:
 hInet = InternetOpenA( \_
 "VB-Tec:INET", OpenType, \_
 vbNullString, vbNullString, 0)
 hURL = InternetOpenUrlA( \_
 hInet, URL, vbNullString, 0, INET\_RELOAD, 0)

 'Daten sammeln:
 Do
 InternetReadFile hURL, Buffer, Len(Buffer), Bytes
 If Bytes = 0 Then Exit Do
 OpenURL = OpenURL & Left$(Buffer, Bytes)
 Loop

 'Inet-Connection schließen:
 InternetCloseHandle hURL
 InternetCloseHandle hInet
End Function

3x Recordset
Hi
vielleicht oder wahrscheinlich liegt es daran, das ich die 3 Tabellen der Datenbank immer einzeln öffne über ein Rst.
Dh. Wenn Punkt ist X, dann Rst öffnen Tab1 und da einlesen.
Wenn Punkt ist Y, dann 1. Rst schliessen neues Rst öffnen Tab2 und da einlesen.
Wenn Punkt ist Z, dann 1. Rst schliessen neues Rst öffnen Tab3 und da einlesen.

Geht das das ich 3 Connections mit 3 Recordsets öffne und dann da meine Daten aufteile???
Am Ende schliesse ich einfach meine 3 Connections wieder???

Mfg Werner

Hi Werner,
k.A. was Rst ist :smile:
Stopp die zeiten und öffne/schließe mal eine datei mit 10.000 Bytes. Dann mach das Gleiche in einer Schleife mit 10.000 dateien a 1 Byte, dann siehst du wo die Zeit flöten geht.
Wenn du hier den Code posten würdest könnte dir evtl jmd helfen die Performance zu erhöhen.
Gruß
Reinhard

Hi
Hi
naja Code posten ist etwas schwierig, da das in das Programm integriert ist, und noch Abfragen zwischendurch gemacht werden.

Ich glaube, das Problem ist nicht das zeilenweise einlesen bzw. aufteilen und zuweisen der Strings in die Datenbank, sondern der Vorgang, das ich 1 Recordset-Objekt für den Zugriff auf die Datenbank definiert habe.

Ich glaube da mache ich mal 3 draus und öffne die Teiltabellen alle gleichzeitig.
Die Zeit geht vermutlich da flöten, wo die Datei einzeln geschlossen und wieder geöffnet werden.

Ich mußte grad feststellen, das der Rechnerunterschied von 1.7Gh auf 2.5Gh 30sec an Zeit ausmacht. Das fand ich schon erschreckend.

Mfg Werner