Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Von hard- auf softcodierten DB-Pfad - es klappt nicht... (https://www.delphipraxis.net/201094-von-hard-auf-softcodierten-db-pfad-es-klappt-nicht.html)

Andreas13 22. Jun 2019 16:04

Datenbank: Absolute Database • Version: 7.91 • Zugriff über: embedded DB

Von hard- auf softcodierten DB-Pfad - es klappt nicht...
 
Hallo Community,
ich benutze die neueste Version (7.91) von Absolute Database. Für die Entwicklungsphase setze ich die Tabellen-Eigenschaften generell z.B.
Delphi-Quellcode:
Table1.Active := True;
Ich möchte erreichen, daß die fertige Exe aus jedem Verzeichnis heraus die Datenbank findet. Dazu gehe ich wie folgt vor:
Delphi-Quellcode:
CONST
  MyDB_Name = 'MyDB.abs';
  Pfad_relativ = '..\..\';
...
procedure TForm1.CreateForm(Sender: TObject);
begin
  MyDB.DatabaseFileName := ExtractFilePath(Application.ExeName) + Pfad_relativ + MyDB_Name;
  MyDB.Open;

  Tabelle1.Open;
  Tabelle2.Open;
end;
Wenn ich die DB zum Testen des obigen "SoftCodes" verschiebe oder umbenenne und die EXE aus einem anderen Verzeichnis heraus starte, kommt es zu einer Exception, wobei die ursprünglich in der Property vorhandene „hardcodierte“ Pfad namentlich vermißt wird, obwohl ich diesen eigentlich überschrieben habe…
Anscheinend wird intern bereits VOR obigem TForm1.CreateForm auf die Datenbank zugegriffen.
Kennt jemand eine Abhilfe?
Danke im Voraus!
Gruß
Andreas

Delphi.Narium 22. Jun 2019 18:03

AW: Von hard- auf softcodierten DB-Pfad - es klappt nicht...
 
Mache es mit FireBird so:

Einmal als Pfad zur Datenbank im Objektinspektor
Code:
.\Data\Datenbankname.fdb
Die Exe erwartete damit in dem Verzeichnis, in dem sie sich befindet ein Unterverzeichnis Data und in diesem liegt die Datenbankdatei.

Klappt ganz gut (oder bisher fehlerfrei) bei allen Programmen, die sich einschließlich der Datenbankdatei auf 'nem USB-Laufwerk / USB-Stick befinden. Damit ist es egal, welchen Laufwerksbuchstaben das Laufwerk, an welchem Rechner auch immer, bekommt.

Falls ein Programm mit Arbeitsverzeichnis aufgerufen wird (z. B. über eine Verknüpfung), kann das hakelig werden. Da hilft dann beim Programmstart, noch bevor auf die Datenbank zugegriffen wird, ein
Delphi-Quellcode:
ChDir(ExtractFilePath(Application.ExeName));
.

Und Datenbanken oder Tabellen werden nie im Objektinspektor mit Active := True versehen, sondern immer erst zur Laufzeit, meist zeitlich etwas verzögert, so dass das Programm schon sichtbar und ansonsten fertig initialisiert ist. Dann kann man vor dem Aufbau der Datenbankverbindung auch problemlos per
Delphi-Quellcode:
FileExists(Datenbankkomponente.DataBase)
prüfen, ob die Datei auch gefunden wird. Wenn nicht, gibt's halt eine sinnvolle Fehlermeldung, statt einer für den Anwender eher irreführenden Exception.

Die im Objektinspektor vorgenommenen Einstellungen werden "lange vor" dem CreateForm abgearbeitet, so dass eine im Objektinspektor geöffnete Datenbankverbindung im CreateForm schon aktiv ist. Irgendwelche dort vorgenommenen Konfigurationsänderungen sind dann leider zu spät.

peterbelow 22. Jun 2019 18:18

AW: Von hard- auf softcodierten DB-Pfad - es klappt nicht...
 
Zitat:

Zitat von Andreas13 (Beitrag 1435175)
Hallo Community,
ich benutze die neueste Version (7.91) von Absolute Database. Für die Entwicklungsphase setze ich die Tabellen-Eigenschaften generell z.B.
Delphi-Quellcode:
Table1.Active := True;
Ich möchte erreichen, daß die fertige Exe aus jedem Verzeichnis heraus die Datenbank findet. Dazu gehe ich wie folgt vor:
Delphi-Quellcode:
CONST
  MyDB_Name = 'MyDB.abs';
  Pfad_relativ = '..\..\';
...
procedure TForm1.CreateForm(Sender: TObject);
begin
  MyDB.DatabaseFileName := ExtractFilePath(Application.ExeName) + Pfad_relativ + MyDB_Name;
  MyDB.Open;

  Tabelle1.Open;
  Tabelle2.Open;
end;
Wenn ich die DB zum Testen des obigen "SoftCodes" verschiebe oder umbenenne und die EXE aus einem anderen Verzeichnis heraus starte, kommt es zu einer Exception, wobei die ursprünglich in der Property vorhandene „hardcodierte“ Pfad namentlich vermißt wird, obwohl ich diesen eigentlich überschrieben habe…
Anscheinend wird intern bereits VOR obigem TForm1.CreateForm auf die Datenbank zugegriffen.
Kennt jemand eine Abhilfe?
Danke im Voraus!
Gruß
Andreas

Stell sicher, dass Active auf False steht bevor Du eine Version baust, die ihre Datenbank per gesetztem Pfad finden soll. Sonst versucht die Anwendung, schon auf die DB zuzugreifen (mit den design-time settings) bevor der onCreate Event des Forms überhaupt aufgerufen wird.

Andreas13 23. Jun 2019 17:13

AW: Von hard- auf softcodierten DB-Pfad - es klappt nicht...
 
Vielen Dank für die wertvollen Tipps & Hinweise!
Gruß
Andreas


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