Einzelnen Beitrag anzeigen

kolio

Registriert seit: 30. Jan 2005
Ort: Plauen
9 Beiträge
 
#3

Paradox über 300 mal schneller als Access?

  Alt 27. Feb 2005, 15:58
In einer Sekunde schaffe ich ca. 22500 Datensätze in eine Paradox-Datenbank zu schreiben, aber nur ca. 70 Datensätze in eine Access-Datenbank. Zum Test habe ich jeweils eine leere Paradox- und Access-Datenbank mit je 3 Feldern ID (AutoWert), SerNr (LongInteger) und SerTx (Text, Länge: 16). Wenn ich bei der Access-Datenbank die ID von "AutoWert" auf "LongInteger" umstelle und manuell (siehe Auskommentierung) mit Werten versorge bringe ich es auf ca. 120 Datensätze pro Sekunde. Immer noch verdammt langsam ... Übrigens, das Ganze läuft auf einem Notebook mit Pentium 4 mobile mit 1,4 GHz und 256 MB RAM.

Hier der Code:

Delphi-Quellcode:
procedure TForm1.Timer1Timer(Sender: TObject);
begin
  WriteFlag := False;
  Timer1.Enabled := False;
end;

// Einfügen in Access-Tabelle
procedure TForm1.ButtonAccessClick(Sender: TObject);
var
  ID,
  SerSt,
  SerNr: LongInt;
  SerTx: String;
begin
  // Max ID ermitteln ----------------------------------------------------------
  // ADOQuery1.Close;
  // ADOQuery1.SQL.Text := 'Select max(ID) as maxID From Tabelle1';
  // ADOQuery1.Open;
  // ID := ADOQuery1.FieldByName('maxID').AsInteger;
  // ---------------------------------------------------------------------------
  ADODataSet1.Open;
  ADODataSet1.Last;
  SerSt := ADODataSet1.FieldByName('SerNr').AsInteger;
  SerNr := SerSt;
  // ---------------------------------------------------------------------------
  WriteFlag := True;
  Timer1.Interval := StrToInt(Edit8.Text) * 1000;
  Timer1.Enabled := True;
  // Daten einfügen ------------------------------------------------------------
  ADODataSet1.Edit;
  while (WriteFlag) do
  begin
    // inc(ID);
    inc(SerNr);
    SerTx := 'XYZ' + RightStr('00000000' + IntToStr(SerNr), 8);
    ADODataSet1.Append;
    // ADODataSet1.FieldByName('ID').AsInteger := ID;
    ADODataSet1.FieldByName('SerNr').AsInteger := SerNr;
    ADODataSet1.FieldByName('SerTx').AsString := SerTx;
    Application.ProcessMessages;
  end;
  ADODataSet1.Post;
  // ---------------------------------------------------------------------------
  ShowMessage(IntToStr(SerNr - SerSt) + ' Datensätze eingefügt');
end;

// Einfügen in Paradox-Tabelle
procedure TForm1.ButtonParadoxClick(Sender: TObject);
var
  SerSt,
  SerNr: LongInt;
  SerTx: String;
begin
  Table1.Open;
  Table1.Last;
  SerSt := Table1.FieldByName('SerNr').AsInteger;
  SerNr := SerSt;
  // ---------------------------------------------------------------------------
  WriteFlag := True;
  Timer1.Interval := StrToInt(Edit9.Text) * 1000;
  Timer1.Enabled := True;
  // ---------------------------------------------------------------------------
  Table1.Edit;
  while (WriteFlag) do
  begin
    inc(SerNr);
    SerTx := 'XYZ' + RightStr('00000000' + IntToStr(SerNr), 8);
    Table1.Append;
    Table1.FieldByName('SerNr').AsInteger := SerNr;
    Table1.FieldByName('SerTx').AsString := SerTx;
    Application.ProcessMessages;
  end;
  Table1.Post;
  // ---------------------------------------------------------------------------
  ShowMessage(IntToStr(SerNr - SerSt) + ' Datensätze eingefügt');
end;
Weis jemand wie ich das schneller hin kriege?
Vielen Dank.
  Mit Zitat antworten Zitat