Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi Access alternative für Paradox? (https://www.delphipraxis.net/40280-access-alternative-fuer-paradox.html)

Plague 13. Feb 2005 17:08

Datenbank: Noch keine ;) • Version: --- • Zugriff über: Query Komponente

Access alternative für Paradox?
 
Hallo,

auf der Suche nach einer alternativen Datenbank für Paradox habe ich mich schon umfassend hier informiert. Firebird wird ja bei jedem zweiten Thema angesprochen, aber ich verstehe den Umgang mit der Datenbank irgendwie nicht.
Daher bin ich jetzt auf die Idee gekommen eine Access Datenbank zu nutzen. Dazu habe ich jetzt aber noch ein paar Fragen:

1. Benötigt Access einen Server oder sonst etwas wie die BDE?
2. Kann ich die DB Datei einfach in den Ordner der Applikation stecken und auf jedem beliebigen Rechner darauf zugreifen?
3. Kann ich mit den Komponenten (TTable, TDataSource, TQuery, etc.) auf die Access DB zugreifen?

Danke
Thomas

mikhal 13. Feb 2005 18:24

Re: Access alternative für Paradox?
 
Um Paradox als "Datenbank"-Backend zu ersetzen würde ich dir zunächst zur http://resolution.extendedsystems.com/ADS/Evaluate+Today/_Free+Downloads.htm raten. Die Umstellung von Paradox zur ADS ist recht einfach, zumal bei Extended Systems diverse Konvertierungstools existieren. Interessant ist vor allem der kostenlose Local Server und die direkte Einbindung in Delphi dank der entsprechenden Komponenten.

Nun zu deinen Fragen:
  • Access ist nicht die Datenbank-Engine, Datenbank-Engine heißt Jet und wird von Microsoft nur noch stiefmütterlich behandelt. Um vernünftig mit der Jet arbeiten zu können, benötigst du die ADO-Schnittstelle, und auf deinem Rechner muß eben diese Jet installiert sein.
  • Ja, das ist grundsätzlich möglich.
  • Du kannst nur mit der BDE (und damit mit der veralteten DAO-Schnittstelle) die bekannten Komponenten verwenden.

Grüße
Mikhal

kolio 27. Feb 2005 15:58

Paradox über 300 mal schneller als Access?
 
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.

ak1 28. Feb 2005 15:20

Re: Access alternative für Paradox?
 
DBASe und Paradox sind zeilenorientiert, deswegen ist Paradox beim zeilenweisen einfügen (table1.append) so schnell. Ich denke mal, dass Access mengenorientiert arbeitet, da solltest du eher einen Benchmark mit sql-Anweisungen machen (inser into table1 values (...)).

kolio 28. Feb 2005 17:19

Re: Access alternative für Paradox?
 
Danke "ak1",

mit SQL ist funktioniert das Ganze etwa um den Faktor 2,5 schneller.

Delphi-Quellcode:
procedure TForm1.Button26Click(Sender: TObject);
var
  i,
  SerNr,
  SerSt,
  Cnt: LongInt;
  SerTx: String;
begin
  // Max SerNr ermitteln -------------------------------------------------------
  ADOQuery1.Close;
  ADOQuery1.SQL.Text := 'Select max(SerNr) as maxSerNr From Tabelle1';
  ADOQuery1.Open;
  SerSt := ADOQuery1.FieldByName('maxSerNr').AsInteger;
  SerNr := SerSt;
  // Anzahl der Datensätze -----------------------------------------------------
  Cnt := StrToInt(Edit3.Text);
  // ---------------------------------------------------------------------------
  T1 := Time;
  for i := 0 to Cnt - 1 do
  begin
    inc(SerNr);
    SerTx := 'IKM' + RightStr('00000000' + IntToStr(SerNr), 8);
    ADOQuery1.Close;
    ADOQuery1.SQL.Text := 'INSERT INTO Tabelle1 (SerNr, SerTx) ' +
                          'VALUES (:PSerNr, :PSerTx)';
    ADOQuery1.Parameters.ParamByName('PSerNr').Value := SerNr;
    ADOQuery1.Parameters.ParamByName('PSerTx').Value := SerTx;
    ADOQuery1.ExecSQL;
  end;
  T2 := Time;
  // ---------------------------------------------------------------------------
  showMessage(IntToStr(Cnt) + ' Datensätze');
  showTime;
end;
Nun hab ich noch ein Problem, was mit "ADODataSet1.LookUp" zwar schneller funktioniert als mit SQL aber immer noch viel zu langsam. Ich muss 100000 Datensätze durchsuchen, welche Seriennummern in aufsteigender Reihenfolge enthalten. Es kann sein, das irgendwo dazwischen eine Seriennummer fehlt. Genau die muss ich herausfinden. Zum Durchsuchen von 20000 Datensätzen brauch ich mit "LookUp" ca. 2,7 Sekunden, mit SQL dauert es eine Ewigkeit.

Mit LookUp:

Delphi-Quellcode:
procedure TForm1.Button8Click(Sender: TObject);
var
  i, SerNr: LongInt;
  V: Variant;
begin
  SerNr := ADODataSet1.FieldByName('SerNr').AsInteger;
  T1 := Time;
  for i := 0 to 99999 do
  begin
    V := ADODataSet1.Lookup('SerNr', SerNr, 'SerNr');
    if not (VarType(V) in [varNull]) then
      inc(SerNr)
    else
      Break;
  end;
  T2 := Time;
  ShowTime;
  ShowMessage('Seriennummer: ' + IntToStr(SerNr));
end;
Mit SQL:

Delphi-Quellcode:
procedure TForm1.Button17Click(Sender: TObject);
begin
  T1 := Time;
  ADOQuery4.Close;
  ADOQuery4.SQL.Text := 'Select SerNr From Tabelle1 ' +
                        'Where (SerNr + 1) Not In (Select SerNr From Tabelle1)';
  ADOQuery4.Open;
  T2 := Time;
  ShowTime;
end;

ak1 3. Mär 2005 09:02

Re: Access alternative für Paradox?
 
Entweder würde ich dafür einen outer join verwenden, oder eine query welche alle DS mit der entsprechenden Sortierung auflistet, dann läufst du die Query durch und vergleichst den Aktuellen Datensatz immer mit dem Vorgänger bzw. umgekehrt. Das dürfte viel schneller gehen als deine Wahnsinns not in sql-Abfrage.

Jelly 3. Mär 2005 09:34

Re: Access alternative für Paradox?
 
Zitat:

Zitat von kolio
Delphi-Quellcode:
procedure TForm1.Button17Click(Sender: TObject);
begin
  T1 := Time;
  ADOQuery4.Close;
  ADOQuery4.SQL.Text := 'Select SerNr From Tabelle1 ' +
                        'Where (SerNr + 1) Not In (Select SerNr From Tabelle1)';
  ADOQuery4.Open;
  T2 := Time;
  ShowTime;
end;

Hast einen Index auf das Feld SerNr gelegt?


Alle Zeitangaben in WEZ +1. Es ist jetzt 02:01 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz