![]() |
Datenbank: Paradox • Version: 5.11 • Zugriff über: BDE
BDE hängt!
Hallo,
ich verwende 3 Programme, die über BDE auf Datenbanken zugreifen. Ein Server, der als Dienst läuft, eine Client-Oberfläche und ein C-Programm mit einer in Delphi geschriebenen DLL. Das C-Programm wird vom Server mit CreateProcess gestartet. Wenn alle drei zusammen laufen, hängt die BDE. Die DLL kommt dabei als letztes, öffnet eine Tabelle, schreibt einige Sätze und schließt sie wieder. Alles ohne Fehler. Das seltsame ist, dass das C-Programm bis zum Ende durchläuft, GetExitCodeProcess mir aber 128 zurückliefert. Beim nächsten Zugriff auf Tabellen frieren sowohl Server als auch Client ein. Genauer gesagt: TTable.open auf dem Server kehrt nicht zurück; das mit einer TQuery verbundene DBGrid wird nicht mehr gezeichnet. In allen drei Programmen verwende ich dasselbe NetDir und jeweils ein eigenes PrivateDir. Der Client erzeugt allerdings auch LCK-Dateien im DB-Verzeichnis!? Das ganze läuft auf Win200 Workstation. BDE Version 5.11. Der Benutzer hat Amdinrechte, der Dienst läuft unter System. LOCAL SHARE steht auf true, damit ich die LCK-Dateien besser verfolgen kann. Das macht aber keinen Unterschied. Ich hab' keine Ahnung mehr wo ich den Fehler noch suchen soll. |
Re: BDE hängt!
Was<macht ie Dll genau? Vielleicht erzeugt diese Locs die nicht mehr entfernt werden?
|
Re: BDE hängt!
1, Um zu checken ob du nicht einfach Speicherlücken im Bereich DB-Komponenten hast häng mal
![]() 2, Von deinem geschilderten System von einem Client und Server zu reden ist etwas zu viel des guten. Wenn es wirklich Client/Server wäre, hättest Du den DB-Zugriff und die Kompos eh nur auf dem Server und eine passende Schnittstelle wie die anderen Komponenten mit dem Server kommunizieren. 3, Nur der obligatorische Satz: Schmeiß die BDE weg. Wie du merkst bekommt man (trotz der Betrachtung aller möglichen bekannten) Fehlerquellen immer wieder Probleme. Aber ich will nicht weiter ausholen. Probier erstmal Punkt 1 um zu sehen obs evtl. nur "triviale" Speicherlücken sind. |
Re: BDE hängt!
Die DLL wird mehrfach aufgerufen.
Beim ersten Mal wird PrivateDir und NetDir von Session gesetzt und eine Tabelle geöffnet, die von den anderen beiden Programmen nicht verwendet wird, aber im gleichen Verzeichnis liegt. Bei jedem Aufruf wird ein Datensatz hinzugefügt oder geändert, die Tabelle bleibt dabei offen. Beim letzten Aufruf wird die Tabelle geschlossen und freigegebn. Ausser schreiben in eine Logdatei, die auch sauber geschlossen wird, macht die DLL nichts. Ich werde die Programm von nun an Dienst und Oberfläche nennen, ok? Eine Schnittstelle für schreibenden Zugriff auf die Datenbanken ist übrigens vorhanden. Die Oberfläche öffnet nur TQuerys und TTable im Browse-Modus. FastMM hab ich in uses eingebunden. Im C-Programm allerdings nicht, das ist nicht mit Borland kompiliert. Und nu? |
Re: BDE hängt!
Wenn die Oberfläche zu ist und die DLL somit sauber durchläuft, bleiben auch kein LCK-Dateien liegen.
|
Re: BDE hängt!
Zitat:
|
Re: BDE hängt!
Das ist interessant, mit FastMM bleibt jetzt schon das C-Programm hängen, die BDE bleibt aber verschont, sofern die Oberfläche keine Query offen hat.
Hat die Oberfläche eine Query offen, kommt das C-Programm weiterhin mit 128 zurück und es wird keine Logdatei erstellt. Im MemoryManager_Event.log findet sich Zitat:
|
Re: BDE hängt!
Hast Du TWinHelpViewer und THelpManager kannst Du vergessen. Evtl. auch noch die Units von
![]() Pack noch Debug-DCU's dazu und schau dir mal die Log-Dateien an. Dort ist der Aufrufstack für deine Speicherlücken drin. |
Re: BDE hängt!
Mit den Helpdingern hab ich nix zu schaffen:
Zitat:
Die eingebundenen Units uses Sysutils, IniFiles, Classes, DBTables, FileCtrl; |
idap32.dbiExt
Ich hab das Ganze mal ausführlich debugt. Beim Beenden der DLL gibt's eine Access Violation.
Das letzte, was ich im Quellcode zu sehen kriege, ist DLLDetachCallback in DBTables. Im Assembler komm ich dann noch bis call idapi32.dbiEXT. Irgendwo da drinnen kracht's dann. |
Re: BDE hängt!
Ergänz mal eine gesonderte Close-Funktion in deiner DLL. Hatte auch mal den Probleme wenn die DB-Verbindung erst beim finalization der Units bzw. beim Destruktor der Units geschlossen wurde. Hier wars aber da in meinem Fall die Screen-Instanz nicht mehr vorhanden war.
|
Re: BDE hängt!
Die TTable hab ich natürlich geschlossen. (Wenn sie offen bleibt macht's aber auch keinen Unterschied.)
Oder meinst du eine andere Close-Funktion? |
Re: BDE hängt!
Zitat:
|
Re: BDE hängt!
TDatabase verwende ich gar nicht.
Hab's aber mal ausprobiert und eine Instanz erzeugt, macht (ja genau) keinen Unterschied. Aber nochmal die Frage nach den LCK-Dateine im DB-Verzeichnis. Ist das normal, dass hier auch PARADOX.LCK und PARADOX.LCK liegen, zusätzlich zu denen im PrivateDir? |
Re: BDE hängt!
Zitat:
|
Re: BDE hängt!
Hallo,
ich würde das DB-Verzeichnis mal auf einen anderen Rechner legen, und in der Systemsteuerung(Computerverwaltung, Freigaben) mir die geöffneten Dateien ansehen. Lokal geht es auch über SysInternals (Processviewer) Heiko |
Re: BDE hängt!
Wie kann ich TTable auf TDatabase umstellen? Die gleichnamige Eigenschaft ist doch readonly.
Und was heisst rechtzeitig? |
Re: BDE hängt!
Hallo
TDataBase.Directory auf dein Verzeichnis setzen oder AliasName auf den BDE-Alias und bei allen TTable DataBaseName auf TDataBase.DataBaseName Ich denke aber, bei Paradox-Tabellen nützt das nicht viel, die Tabellen werden bei einem TDataBase.Connected=False (Close, oder was immer) nicht geschlossen. Es käme auf einen Test an. Das kannst du aber auch über mein obiges Posting machen. Heiko |
Re: BDE hängt!
TDatabase war über DatabaseName bereits richtig verknüpft und auch geschlossen.
Die LCK-Dateien kommen mir aber immer noch komisch vor. (Wenn das Problem überhaupt hier liegt.) In OnShow des Hautpfensters, das selber keine BDE-Komponenten hat, setze ich Session.PrivateDir. PDOXUSRS.LCK wird auch sofort dort angelegt. Soweit OK. Ausserdem wird dort TDatabase instanziiert.
Delphi-Quellcode:
Erst bei Bedarf werden Formulare kreiert.
Session.NetFileDir := path+'NET';
Session.PrivateDir := ExtractFilePath(ParamStr(0))+'CLIENT'; globalDatabase := TDatabase.Create(nil); with globalDatabase do begin databaseName := 'MyDB'; DriverName := 'STANDARD'; globalDatabase.Params.Add('PATH='+path); connected := true; end;
Delphi-Quellcode:
In OnShow eines anderen Formulars wird dann eine TTable geöffnet. Jetzt erscheint auch eine PDOXUSRS.LCK im DB-Verzeichnis.
object MyTab: TTable
DatabaseName = 'MyDB' TableName = 'DATA.DB' object DataField1: TStringField FieldName = 'Field1' Size = 6 end end Soll das so sein?? |
Re: BDE hängt!
Ja,
damit Paradox feststellen kann, ob eine Tabelle exclusiv geöffnet werden kann, wird auch das blosse Öffnen einer Tabelle protokolliert (in ebend jeder LCK-Datei). Heiko |
Alle Zeitangaben in WEZ +1. Es ist jetzt 17:07 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