AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Datenbanken Delphi Access alternative für Paradox?
Thema durchsuchen
Ansicht
Themen-Optionen

Access alternative für Paradox?

Offene Frage von "kolio"
Ein Thema von Plague · begonnen am 13. Feb 2005 · letzter Beitrag vom 3. Mär 2005
Antwort Antwort
Plague

Registriert seit: 6. Okt 2003
591 Beiträge
 
#1

Access alternative für Paradox?

  Alt 13. Feb 2005, 17:08
Datenbank: Noch keine ;) • Version: --- • Zugriff über: Query Komponente
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
  Mit Zitat antworten Zitat
Benutzerbild von mikhal
mikhal

Registriert seit: 11. Sep 2003
Ort: Linz am Rhein
796 Beiträge
 
Delphi 11 Alexandria
 
#2

Re: Access alternative für Paradox?

  Alt 13. Feb 2005, 18:24
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
Michael Kraemer
Computer erleichtern die Arbeit...
...und die Erde ist eine Scheibe!
  Mit Zitat antworten Zitat
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
ak1

Registriert seit: 12. Okt 2003
243 Beiträge
 
#4

Re: Access alternative für Paradox?

  Alt 28. Feb 2005, 15:20
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 (...)).
  Mit Zitat antworten Zitat
kolio

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

Re: Access alternative für Paradox?

  Alt 28. Feb 2005, 17:19
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;
  Mit Zitat antworten Zitat
ak1

Registriert seit: 12. Okt 2003
243 Beiträge
 
#6

Re: Access alternative für Paradox?

  Alt 3. Mär 2005, 09:02
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.
  Mit Zitat antworten Zitat
Benutzerbild von Jelly
Jelly

Registriert seit: 11. Apr 2003
Ort: Moestroff (Luxemburg)
3.741 Beiträge
 
Delphi 2007 Professional
 
#7

Re: Access alternative für Paradox?

  Alt 3. Mär 2005, 09:34
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?
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 20:19 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