Hallo,
in einer Access2000-Datenbank habe ich eine Tabelle tblArtikel ; der Primärschlüssel setzt sich zusammen aus den Feldern SUCHBEGRIFF und ARTNR. Das Feld ARTORGNR ist ebenfalls indiziert. Nun muss der Inhalt einer Textdatei durchgelesen und einige Felder in tblArtikel müssen aktualisiert werden. Eventuell muss auch ein neuer Datensatz angeelgt werden.
Das klappt auch soweit prima, ist allerdings sehr langsam (läuft etwa 10 Minuten). Die Textdatei enthält ca. 3.500 Datensätze, die Tabelle tblArtikel etwa 25.000.
Die Tabelle tblArtikel enthält in der Realität über 100 Felder. Ich öffne Sie daher mit dem SQL-Befehl.
Hier die Codeschnipsel:
Zunächst die Definitionen:
Nun die Datenbank und das Öffnen der Tabelle:
Und so wird das Ganze verarbeitet:
Ich habe die Vermutung, dass der Befehl
gar nicht auf den Index zugreift.
Was mache ich falsch? Jeder Tipp ist willkommen!
Danke, Gruß
Schorsch
in einer Access2000-Datenbank habe ich eine Tabelle tblArtikel ; der Primärschlüssel setzt sich zusammen aus den Feldern SUCHBEGRIFF und ARTNR. Das Feld ARTORGNR ist ebenfalls indiziert. Nun muss der Inhalt einer Textdatei durchgelesen und einige Felder in tblArtikel müssen aktualisiert werden. Eventuell muss auch ein neuer Datensatz angeelgt werden.
Das klappt auch soweit prima, ist allerdings sehr langsam (läuft etwa 10 Minuten). Die Textdatei enthält ca. 3.500 Datensätze, die Tabelle tblArtikel etwa 25.000.
Die Tabelle tblArtikel enthält in der Realität über 100 Felder. Ich öffne Sie daher mit dem SQL-Befehl.
Hier die Codeschnipsel:
Zunächst die Definitionen:
VB.NET-Quellcode
- Option Strict On
- Imports System.Data.OleDb
- Imports System.IO
- ...
- Dim strINH As String
- Dim intANF As Integer
- Dim intEND As Integer
- Dim strARTORGNR As String
- Dim cmb As New OleDb.OleDbCommandBuilder
- Dim conDB As New OleDbConnection
- Dim dt01 As New DataTable ' tblArtikel
- Dim cm01 As New OleDb.OleDbCommand
- Dim da01 As New OleDb.OleDbDataAdapter
- Dim dr01 As DataRow
- Dim dr01s() As DataRow
- Dim strSQLART As String
Nun die Datenbank und das Öffnen der Tabelle:
VB.NET-Quellcode
- conDB.ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\QUISY70\QPSFIL70.MDB;Jet OLEDB:System Database=C:\TESTDB\TESTWRKGRP.MDW;User ID=TESTUSER;Password=TESTPWD;"
- strSQLART = "SELECT tblArtikel.SUCHBEGRIFF, tblArtikel.ARTNR, tblArtikel.ARTORGNR, tblArtikel.MWST, tblArtikel.EKPREIS, "
- strSQLART = strSQLART & "tblArtikel.VKPREIS, tblArtikel.LZPRAEND "
- strSQLART = strSQLART & "FROM tblArtikel;"
- With cm01
- .Connection = conDB
- .CommandText = strSQLART
- .CommandType = CommandType.TableDirect
- End With
- With da01
- .SelectCommand = cm01
- End With
- da01.MissingSchemaAction = MissingSchemaAction.AddWithKey
- da01.Fill(dt01)
Und so wird das Ganze verarbeitet:
VB.NET-Quellcode
- Dim srIMP As New IO.StreamReader("C:\TESTDB\ARTIKEL_TEST.TXT", System.Text.Encoding.Default)
- Do
- strINH = srIMP.ReadLine
- If IsNothing(strINH) Then
- Exit Do
- End If
- '
- ' die Felder strSUCHBEGRIFF und strARTNR wurden bereits gefüllt...
- intANF = 15
- intEND = Strings.InStr(intANF, strINH, ";", CompareMethod.Text) ' Org.-Artikelnummer
- If intEND > 0 Then
- strARTORGNR = CStr(Strings.Mid(strINH, intANF, intEND - intANF))
- End If
- intANF = intEND + 1
- ' danach werden MWST, EKPREIS und VKPREIS gefüllt
- ' wenn Datensatz fehlt -> anlegen, ansonsten verändern
- strKRIT = "ARTORGNR = '" & strARTORGNR & "'"
- dr01s = dt01.Select(strKRIT)
- If dr01s.Length = 0 Then
- bolNEU = True
- dr01 = dt01.NewRow
- dr01!SUCHBEGRIFF = Strings.Left(strSUCHBEGRIFF, 15)
- dr01!ARTNR = strARTNR
- dr01!ARTORGA = strARTORGNR
- Else
- bolNEU = False
- dr01 = dr01s(0)
- End If
- dr01!MWST = intMWST
- dr01!EKPREIS = dblEKPREIS
- dr01!VKPREIS = dblVKPREIS
- If bolNEU Then
- dt01.Rows.Add(dr01)
- End If
- cmb = New OleDbCommandBuilder(da01)
- da01.Update(dt01)
- Loop
- cm01.Dispose()
- da01.Dispose()
- dt01.Clear()
- dt01.Dispose()
Ich habe die Vermutung, dass der Befehl
gar nicht auf den Index zugreift.
Was mache ich falsch? Jeder Tipp ist willkommen!
Danke, Gruß
Schorsch