![]() |
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:
Wobei ATableName für jeden Durchlauf immer eine andere Tabelle ist.
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; In der BDE habe ich den Wert MAXFILEHANDLE schon auf 2000 gesetzt. :???: Was mache ich falsch ? :gruebel: MfG Wo_to |
Re: "Meldung: Zu viele offene Tabellen" Wie kann m
Warum erzeugst du 500 Table-Komponenten? Würde doch einen reichen, welche du wiederverwendest.
|
Re: "Meldung: Zu viele offene Tabellen" Wie kann m
also ich würde das erst mal umstellen:
Delphi-Quellcode:
Ob damit Dein Fehler schon beseitigt ist, kann ich nicht versprechen.
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; Aber die Sache wird sicher einiges schneller... |
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:
Vielleicht wäre es besser, dem Create eine TTable zu übergeben und diese immer wieder zu verwenden !!
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; (Der Gedanke kam mir gerade) Aber warum sind die Tabellen nach einem Close immer noch geöffnet ? MfG Wo_to |
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; |
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 |
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 08:22 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz