AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Datenbanken Delphi "Meldung: Zu viele offene Tabellen" Wie kann man das umgehen
Thema durchsuchen
Ansicht
Themen-Optionen

"Meldung: Zu viele offene Tabellen" Wie kann man das umgehen

Ein Thema von Wo_to · begonnen am 27. Okt 2006 · letzter Beitrag vom 27. Okt 2006
Antwort Antwort
Wo_to

Registriert seit: 22. Sep 2005
7 Beiträge
 
#1

"Meldung: Zu viele offene Tabellen" Wie kann man d

  Alt 27. Okt 2006, 07:08
Datenbank: FoxPro • Zugriff über: BDE
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"

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 ?

MfG
Wo_to
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

Registriert seit: 9. Dez 2005
Ort: Heilbronn
39.851 Beiträge
 
Delphi 11 Alexandria
 
#2

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

  Alt 27. Okt 2006, 07:17
Warum erzeugst du 500 Table-Komponenten? Würde doch einen reichen, welche du wiederverwendest.
Markus Kinzler
  Mit Zitat antworten Zitat
Benutzerbild von RavenIV
RavenIV

Registriert seit: 12. Jan 2005
Ort: Waldshut-Tiengen
2.875 Beiträge
 
Delphi 2007 Enterprise
 
#3

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

  Alt 27. Okt 2006, 07:25
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...
Klaus E.
Linux - das längste Text-Adventure aller Zeiten...
Wer nie Linux mit dem vi konfiguriert hat, der hat am Leben vorbei geklickt.
  Mit Zitat antworten Zitat
Wo_to

Registriert seit: 22. Sep 2005
7 Beiträge
 
#4

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

  Alt 27. Okt 2006, 07:33
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
  Mit Zitat antworten Zitat
Benutzerbild von Union
Union

Registriert seit: 18. Mär 2004
Ort: Luxembourg
3.487 Beiträge
 
Delphi 7 Enterprise
 
#5

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

  Alt 27. Okt 2006, 09:09
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;
Ibi fas ubi proxima merces
sudo /Developer/Library/uninstall-devtools --mode=all
  Mit Zitat antworten Zitat
hoika

Registriert seit: 5. Jul 2006
Ort: Magdeburg
8.270 Beiträge
 
Delphi 10.4 Sydney
 
#6

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

  Alt 27. Okt 2006, 15:13
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
Heiko
  Mit Zitat antworten Zitat
Wo_to

Registriert seit: 22. Sep 2005
7 Beiträge
 
#7

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

  Alt 27. Okt 2006, 16:44
Hallo zusammen,
vielen Dank für eure Anregungen.

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.

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.

Vielen Dank nochmal !

MfG
Wo_to
  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 23:36 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