Programm findet die Datenbank nicht

Für Themen zu Datenbanken und Zugriff auf diese. Auch für Datenbankkomponenten.
Antworten
Luckner
Beiträge: 88
Registriert: Sa 18. Jan 2020, 09:56
OS, Lazarus, FPC: Winux (L 2.2.0 FPC 3.2.2)
CPU-Target: Windows 64-Bit

Programm findet die Datenbank nicht

Beitrag von Luckner »

Hallo,
habe eine Firebird-Datenbank und greife auf die mit den Zeos-Komponenten zu. Habe in der Form1 folgende Zeilen:

Code: Alles auswählen

procedure TForm1.FormActivate(Sender: TObject);
  var F: TextFile;
begin
  AssignFile(F,'./verbi/verbi.txt');
  Reset (F);
  ReadLn (F, dbpfad);

  DataModule_KS.ZConnectionKunden.Database:= dbpfad;
  DataModule_AdressenStamm.ZConnectionAdressen.Database := dbpfad;
  DataModule_Stammdaten.ZConnectionStammdaten.Database := dbpfad;
  DataModule_LS.ZConnectionLieferanten.Database := dbpfad;
  DataModuleArtikel.ZConnectionArtikel.Database := dbpfad;
  DataModuleMaterial.ZConnectionMaterial.Database := dbpfad;
  DataModuleMaterial.ZConnectionMaterialPreise.Database := dbpfad;
  DataModuleStanzen.ZConnectionStanzen.Database := dbpfad;
  DataModuleMaschinen.ZConnectionMaschinen.Database:= dbpfad;
  DataModuleKlischee.ZConnectionKlischee.Database:= dbpfad;
  DataModuleAbhaengikeiten.ZConnectionAbhaengikeiten.Database:= dbpfad;
  DataModuleWerkzeuge.ZConnectionWerkzeuge.Database:= dbpfad; 
  
   DataModule_KS.ZConnectionKunden.Disconnect;
  DataModule_AdressenStamm.ZConnectionAdressen.Disconnect;
  DataModule_Stammdaten.ZConnectionStammdaten.Disconnect;
  DataModule_LS.ZConnectionLieferanten.Disconnect;
  DataModuleArtikel.ZConnectionArtikel.Disconnect;
  DataModuleMaterial.ZConnectionMaterial.Disconnect;
  DataModuleMaterial.ZConnectionMaterialPreise.Disconnect;
  DataModuleStanzen.ZConnectionStanzen.Disconnect;
  DataModuleMaschinen.ZConnectionMaschinen.Disconnect;
  DataModuleKlischee.ZConnectionKlischee.Disconnect;
  DataModuleAbhaengikeiten.ZConnectionAbhaengikeiten.Disconnect;
  DataModuleWerkzeuge.ZConnectionWerkzeuge.Disconnect;
end;
In der Datei verbi,txt steht:
"192.168.1.11:D:\Datenbank\ETIKBASE.FDB"

Wärend der Entwicklung habe ich in jeder ZConnection unter Database den Datenbankpfad eingetragen um in den ZQuery-Komponenten die Felder einzulesen. Allerdings habe ich diese Datenbank für die Entwicklung noch in einem anderem Verzeichnis "192.168.1.11:D:\Projekte\Datenbank\ETIKBASE.FDB" gehabt. Nach dem Einlesen der Felder in den ZQuery-Komponenten habe ich die Pfade in den ZConnections gelöscht und damit sind die ZConnections disconnectet geworden.

Nach dem Umzug der Datenbank in das Verzeichnis "192.168.1.11:D:\Datenbank\ETIKBASE.FDB" bekomme ich bei Aufruf des Programms eine Fehlermeldung "SQL-Error: I/O-Error during
Create-File (open) operation for file D:\Projekte\Datenbank\ETIKBASE.FDB .... Das System kann die Datei nicht finden.

Habe daraufhin alle ZConnections überprüft, ob noch irgendwo ein Eintrag zum alten Verzeichnis existiert, jedoch nichts gefunden. Habe Lazarus alle Dateien nach diesem Verzeichnis
absuchen lassen, jedoch nichts gefunden. Jetzt bin ich am ende mit meinem Latein. Kann Jemand helfen?

Danke, Luckner

wp_xyz
Beiträge: 4893
Registriert: Fr 8. Apr 2011, 09:01

Re: Programm findet die Datenbank nicht

Beitrag von wp_xyz »

Vielleicht gibt es die Datei verbi.txt mehrfach? Du öffnest du sie über einen relativen Pfad. In welchem Verzeichnis ist denn dein Programm zu diesem Augenblick? Wahrscheinlich in dem mit der exe-Datei. Dort müsste es eine Datei verbi/verbi.txt geben. Was steht da drin? Aber sicher ist das mit der exe-Datei nicht. Vielleicht macht dein Programm irgendwann ein chdir, und dann bist du ganz wo anders. Oder das Programm wird aus einem ganz anderen Ordner gestartet? Relative Pfade solltest du vermeiden. Besser wären

Code: Alles auswählen

AssignFile(F, Application.Location + 'verbi/verbi.txt');
// oder
AssignFile(F, GetAppConfigDir(false) + 'verbi/verbi.txt');

Benutzeravatar
gladio
Beiträge: 217
Registriert: Sa 21. Jun 2014, 06:15
OS, Lazarus, FPC: Win10-64 - aktuelle Lazarus/FPC Standard-Edition
CPU-Target: 64Bit
Wohnort: Rügen

Re: Programm findet die Datenbank nicht

Beitrag von gladio »

Da scheint noch irgendwo der alte Pfad gespeichert zu sein:
D:\Projekte\Datenbank\ETIKBASE.FDB .... Das System kann die Datei nicht finden.
Prüf mal im Objektinspektor, bei DB-Pfad sollte nichts drin stehen

edit:
und die ZConnection darf natürlich erst mit der Datenbank verbunden werden, wenn der richtige Pfad zugewiesen ist.
Am besten ganz weit vorn im Programm zuweisen, bzw. das Datamodul gleich nach dem Hauptform erzeugen.

Joh
Lazarusforum e. V.
Beiträge: 191
Registriert: Sa 26. Mai 2012, 17:31
OS, Lazarus, FPC: Win 10 (L 2.2.6 x64 FPC 3.2.2)
CPU-Target: 64Bit

Re: Programm findet die Datenbank nicht

Beitrag von Joh »

ich denke, in irgendeiner Form ist die alte Datenbank noch Connected.
Ich arbeite jetzt nicht mit Zeos, aber es müßte ähnlich gehen. Auch dort gibt es eine Connection.Connected...

Da du von Laufwerksbuchstaben sprichst, scheinbar Windows.

In einem cmd-Fenster im Projekt-Verzeichnis suchen nach:

Code: Alles auswählen

findstr /N /I /C:"Connected = true" *.lfm
just my two Beer

charlytango
Beiträge: 845
Registriert: Sa 12. Sep 2015, 12:10
OS, Lazarus, FPC: Laz stable (2.2.6, 3.x)
CPU-Target: Win 32/64, Linux64
Wohnort: Wien

Re: Programm findet die Datenbank nicht

Beitrag von charlytango »

Luckner hat geschrieben:
Do 18. Mai 2023, 20:52
habe eine Firebird-Datenbank und greife auf die mit den Zeos-Komponenten zu. Habe in der Form1 folgende Zeilen:

Just my 2 cents....

offensichtlich hast du in jedem deiner Datenmodule eine eigene Connection zur Datenbank.
Die Verbindung zur Datenbank ist für mich ein essentielles Element das in meinen Programmen nur einmal pro Programm vorkommt.
Eine einzelne Verbindung zur Datenbank (egal ob TZConnection, TSQLConnector oder auch spezialisierte Verbindungskomponenten wie TIBConnection) kann für mehrere (in meinem Fall alle) Querykomponenten im Programm verwalten. Für eine "normale" Datenbankapplikation ohne threading ist IMHO nur eine DB-Connection nötig. Wenn es dabei Performanceprobleme gibt hat man meistens eher Designprobleme oder ein mangelhaftes DB-Design bzw fehlende Indizes, Views etc.

Somit habe ich nur eine einzige Datenbankverbindung um die ich mich kümmern muss. Und die ist dementsprechend abgesichert und prüft auch immer das Vorhandensein der benutzt en (Konfigurations-)Dateien und aller Einstellungen.

DB-Verbindungen sind bei mir zur Designzeit immer inaktiv/offline damit es beim Programmstart keine Probleme gibt die ich nicht abfangen kann.

Wenn du mit Datenmodulen arbeitest empfehle ich dir, die DB-Zugriffskomponenten (und ggfs auch etwaiges Monitoring etc) in einem eigenen Datenmodul zu verwalten und bei Programmstart (oder einem dir genehmen Zeitpunkt) die DB-Verbindung kontrolliert aufzubauen.
Den Query-Komponenten in den anderen Datenmodulen weist du die DB-Connection entweder zur Laufzeit zu oder auch zur Designzeit.

Von den Datenmodulen bin ich im Laufe der Zeit abgekommen und nutze nun andere Strategien. Feel free to use.

Luckner
Beiträge: 88
Registriert: Sa 18. Jan 2020, 09:56
OS, Lazarus, FPC: Winux (L 2.2.0 FPC 3.2.2)
CPU-Target: Windows 64-Bit

Re: Programm findet die Datenbank nicht

Beitrag von Luckner »

Hallo Joh,

vielen Dank für Derinen Tipp. Tatsächlich hatte ich doch noch eine Connection offen und den alten Pfad der Datenbank noch eingetragen. Super!!! Auch den Anderen danke für die Hinweise. Ich habe für verschiedenen Tabellen der Datenbank auch einige Datenmodule erstellt. Für ein kleines Provisorium dann ebenfalls eines und im laufe der Monate vergessen.
Ist nicht aufgefallen, weil die Datenbank während der Entwicklung immer an der selben stelle war und jetzt für einen Test im Netzwerk, dann in ein anderes Verzeichniss kopiert worden ist.

Vielen Dank und Gruß, Luckner

Antworten