Einzelnen Beitrag anzeigen

Michael80

Registriert seit: 20. Nov 2003
Ort: Treuchtlingen
72 Beiträge
 
Delphi 10.3 Rio
 
#1

Zugriffsverletzung bei 2. Durchlauf einer Schleife

  Alt 3. Mär 2008, 15:55
Hallo Leute,

ich habe hier ein kleines Problem und komme nicht weiter. Ich versuche mehrere Dateien nacheinander in eine Tabelle einzulesen.
Mit der ersten Datei klappt alles wunderbar, doch sobald das Programm zum 2. mal durchläuft bekomme ich folgende Fehlermeldung:

Zugriffsverletzung bei Adresse 004217FB in Modul "einlesen.exe". Lesen von Adresse 00000005.

und dann steht die Schleife. Im Debug-Mode habe ich die Stelle lokalisiert, weiß nur nicht wo der Fehler ist.

Vielleicht findet ihr hier was.

Hier die gesamte Prozedur:
Delphi-Quellcode:
procedure TForm2.Button1Click(Sender: TObject);
var
  mastersl : TStringList;
  detailsl : TStringList;
  fieldssl : TStringList;
  logsl : TStringList;
  ndx : Integer;
  anz,i,po, datensaetze,fidx, flag,didx,wmax,lidx : Integer;
  pfad, datei,fields, jetzt, fehlfeld,felder,werte : string;
begin
OpenDialog1.Execute;
Listbox1.Items := OpenDialog1.Files;
  mastersl := TStringList.Create; // Master StringList
  detailsl := TStringList.Create; // Detail StringList
  fieldssl := TStringList.Create; // Felder StringList
  logsl := TStringList.Create; // Log StringList
  for i :=0 to ListBox1.Items.Count -1 do
    begin
    pfad := Listbox1.Items[i];
    datei := pfad;
    po := pos('\',datei);
    while (po > 0) do
    begin
    delete(datei,1,po);
    po := pos('\',datei);
    end;
    begin
    Adoquery1.SQL.Text := 'select * from information_schema.tables where table_name=''dpd_'+datei+''' ' ;
    adoquery1.Active := true;
    end;
    if adoquery1.RecordCount > 0 then
      begin
        logsl.Add('Die Tabelle '+datei+' wurde gefunden ');
        fieldssl.Delimiter := '|';
        mastersl.LoadFromFile(pfad);
        fields := mastersl.strings[5];
        po := pos(' ',fields);
        delete(fields,1,po);
        fieldssl.DelimitedText := fields;
        wmax := fieldssl.count-1;
        for fidx := 0 to wmax -1 do
        begin
        if felder = 'then
        begin
        felder := '['+fieldssl.strings[fidx]+']';
        end
        else
        begin
        felder := felder + ',['+fieldssl.strings[fidx]+']';
        end;
        end;
        flag := 0;
        fehlfeld := '';
        werte := '';
        for fidx := 0 to Pred(wmax) do
        begin
        if werte = 'then
        begin
        werte := ':wert'+inttostr(fidx);
        end
        else
        begin
        werte := werte +',:wert'+inttostr(fidx);
        end;
        end;
          for fidx := 0 to Pred(wmax)-1 do
          begin
          Adoquery2.SQL.Text := 'select * from information_schema.columns where table_name=''dpd_'+datei+''' and Column_name='''+fieldssl.strings[fidx]+''' ' ;
          AdoQuery2.Active := true;
            if adoquery2.RecordCount > 0 then
            begin
            //logsl.Add('Das Feld '+fieldssl[fidx]+' wurde gefunden ');
            try
            detailsl.Delimiter := '|'; // Trennzeichen der Einträge pro Zeile
            mastersl.LoadFromFile(pfad);
            for ndx := 7 to Pred (mastersl.Count) do
            begin
            detailsl.Clear;
            detailsl.DelimitedText := mastersl.Strings[ndx];
            datensaetze := 0;
            with arbeitsquery do
            begin
            Close;
            SQL.Text := 'INSERT INTO DPD_'+datei+' ('+felder+') VALUES ('+werte+')';
            ParamCheck := True;
            for didx := 0 to wmax -1 do
            begin
            if detailsl.strings[didx] = 'then
            begin
            Parameters.ParamByName('wert'+inttostr(didx)).value := 'NULL';
            logsl.add ('wert'+inttostr(didx)+' NULL');
            end
            else
            begin
            Parameters.ParamByName('wert'+inttostr(didx)).value := detailsl.Strings[didx];
            logsl.add ('wert'+inttostr(didx)+' '+detailsl.Strings[didx]);
            end;
            end;
            Datensaetze := Datensaetze +1;
            ExecSQL;
            end;
            end;
            finally
            FreeAndNil (mastersl);
            FreeAndNil (detailsl);
            end;
          end
            else
            begin
            flag := 1;
            fehlfeld := fehlfeld + ' '+fieldssl[fidx];
            logsl.Add('Das Feld '+fieldssl[fidx]+' wurde nicht gefunden ');
            end;
          end;
        end
      else
        begin
          logsl.Add(pfad +' nicht gefunden');
          logsl.Add('------------------------------------------------');
          logsl.Add('');
        end;
      if flag = 0 then
        begin
          logsl.Add('');
          logsl.Add('Die Datei '+pfad+' wurde korrekt eingelesen');
          logsl.Add('es wurden '+inttostr(datensaetze)+' Datensätze importiert');
          logsl.Add('------------------------------------------------');
          logsl.Add('');
        end
        else
        begin
          logsl.Add('');
          logsl.Add('Das/Die Felder '+fehlfeld+' wurden nicht gefunden.');
          logsl.Add('es wurden keine Datensätze aus der Tabellen '+datei+' importiert');
          logsl.Add('------------------------------------------------');
          logsl.Add('');
        end;
    end;
  jetzt := datetimetostr(now);
  jetzt := StringReplace(jetzt, ':', '.', [rfReplaceAll]);
  logsl.SaveToFile('c:/import_log_'+jetzt+'.txt');
  end;
und hier die Problemstelle:

Delphi-Quellcode:
for i :=0 to ListBox1.Items.Count -1 do
    begin

Schon mal danke für die Hilfe!

Gruß

Michael
Wer kämpft kann verlieren, wer nicht kämpft hat schon verloren
  Mit Zitat antworten Zitat