Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi "Meldung: Zu viele offene Tabellen" Wie kann man das umgehen (https://www.delphipraxis.net/79727-meldung-zu-viele-offene-tabellen-wie-kann-man-das-umgehen.html)

Wo_to 27. Okt 2006 07:08

Datenbank: FoxPro • Zugriff über: BDE

"Meldung: Zu viele offene Tabellen" Wie kann man d
 
Hallo zusammen,
ich habe folgendes Problem:

In einer Schleife werden mehrere Foxpro-Tabellen (ca. 500) geöffnet und Werte ausgelesen.
Nach etwa 200 bearbeiteten Tabellen, kommt immer die Meldung:

"Zu viele offene Tabellen geöffnet" :wall:

Ich bearbeite die Tabellen wie folgt:
Delphi-Quellcode:
for i := 0 to Pred(500) do
begin
ATable := TTable.Create(nil);
ATable.DatabaseName := ADataBase;
ATable.TableName := ATableName;
ATable.Active := true;

... Werte auslesen

ATable.Close
ATable.Active := false;
FreeAndNil(ATable);
end;
Wobei ATableName für jeden Durchlauf immer eine andere Tabelle ist.
In der BDE habe ich den Wert MAXFILEHANDLE schon auf 2000 gesetzt. :???:

Was mache ich falsch ? :gruebel:

MfG
Wo_to

mkinzler 27. Okt 2006 07:17

Re: "Meldung: Zu viele offene Tabellen" Wie kann m
 
Warum erzeugst du 500 Table-Komponenten? Würde doch einen reichen, welche du wiederverwendest.

RavenIV 27. Okt 2006 07:25

Re: "Meldung: Zu viele offene Tabellen" Wie kann m
 
also ich würde das erst mal umstellen:
Delphi-Quellcode:
ATable := TTable.Create(nil);
ATable.DatabaseName := ADataBase;
for i := 0 to Pred(500) do
begin
ATable.TableName := ATableName;
ATable.Open;

... Werte auslesen

ATable.Close
end;
ATable.Free;
Ob damit Dein Fehler schon beseitigt ist, kann ich nicht versprechen.
Aber die Sache wird sicher einiges schneller...

Wo_to 27. Okt 2006 07:33

Re: "Meldung: Zu viele offene Tabellen" Wie kann m
 
Hallo MKinzler

Der Code gibt nicht die Originalversion wieder. Ansonsten müßte ich das ganze Programm zum Download bereitstellen.

Ich gebe dir natürlich recht, wenn man sich den von mir angegebenen Code ansieht. Hier nocht etwas detailierter:

Ich erzeuge Objekte, die sich selber Werte aus einer Tabelle auslesen. D.h. innerhalb der Klasse erzeuge ich beim Anlegen der Objekte eine TTable und zerstöre diese Instanz wieder, nachdem ich alle benötigten Werte ausgelesen habe.

Delphi-Quellcode:
for i := 0 to Pred(500) do
begin
  AObject := TMyClass.Create;
end;

constructor TMyClass.Create;
var
  ATable : TTable;
begin
  ATable := TTable.Create(nil);
  ATable.DatabaseName := ADataBase;
  ATable.TableName := ATableName;
  ATable.Active := true;

... Werte auslesen und in den privaten Feldern speichern

  ATable.Close
  ATable.Active := false;
  FreeAndNil(ATable);
end;
Vielleicht wäre es besser, dem Create eine TTable zu übergeben und diese immer wieder zu verwenden !!
(Der Gedanke kam mir gerade)

Aber warum sind die Tabellen nach einem Close immer noch geöffnet ?

MfG
Wo_to

Union 27. Okt 2006 09:09

Re: "Meldung: Zu viele offene Tabellen" Wie kann m
 
Also folgender Code läuft bei mir durch bis zum Integer-Überlauf ;) Unterscheid ist dass kein persistentes DB-Objekt verwendet wird. Vielleicht mal mit DBIDataBaseFlush versuchen...
Delphi-Quellcode:
procedure TForm1.btnStartClick(Sender: TObject);
var
   Table : TTable;
   i : integer;
begin
   Stopped := false;
   btnStart.Enabled := false;
   btnStop.Enabled := true;
   i := 0;
   repeat
      inc(i);
      Table := TTable.Create(nil);
      try
         Table.DatabaseName := 'd:\develop\temp\p';
         Table.TableType   := ttFoxPro;
         Table.TableName   := 'zugang';
         Table.Open;
         Table.Close;
      except
      end;
      Table.Free;
      Label1.Caption := IntToStr(i);
      Application.ProcessMessages;
   until Stopped
end;

hoika 27. Okt 2006 15:13

Re: "Meldung: Zu viele offene Tabellen" Wie kann m
 
Hallo,

die BDE hat halt "ein paar Begrenzungen".
Du machst die Tabelle vielleicht doch nicht richtig zu.

try finally würde helfen.

sind das wirklich 500 verschiedene Tabellen ??
Falls nicht, würde ich so umbauen, dass ich zuerst die Klassen erzeugt werden,
dann aus den Klassen eine Liste der benötigten Tabellen-Namen generiert wird
(jede Klasse kennt ja ihre Tabelle), dann die benötigten Tabellen erzeugt/geöffnet
und den einzelnen Klassen als TTable übergeben wird.

Übrigens heisst es in der Tag FileHandles,
jede deiner Tabellen besteht aber aus mehr als einer Datei,
weil die Indexdateien bei jedem Öffnen auch geöffnet werden müssen
(zumindestens bei Paradox war das so, Gott hab das selig ;) )

Falls du einen Extra-Server hast, könntest du die DB ja auch mal auf
ein Netzlauferk legen und unter Systemsteuerung-Verwaltung die offenen Dateien ansehen.



Heiko

Wo_to 27. Okt 2006 16:44

Re: "Meldung: Zu viele offene Tabellen" Wie kann m
 
Hallo zusammen,
vielen Dank für eure Anregungen. :-D

Ich habe mein Programm umgebaut und übergebe jetzt den Objekten ein und dieselbe TTable. Innerhalb des Objektes schaltet das Objekt auf die benötigte FoxPro-Tabelle selbstständig um. Somit habe ich immer nur eine TTable-Instanz offen. :coder:

Ich habe in manchen Projekten nicht nur 500 FoxPro-Tabellen zu duchforsten, sondern vielleicht an die 1000. Zumindest läuft das Programm jetzt fehlerfrei durch, auch mit 1000 FoxPro-Tabellen. :dancer:

Vielen Dank nochmal !

MfG
Wo_to


Alle Zeitangaben in WEZ +1. Es ist jetzt 00:39 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