AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Datenbanken Von hard- auf softcodierten DB-Pfad - es klappt nicht...
Thema durchsuchen
Ansicht
Themen-Optionen

Von hard- auf softcodierten DB-Pfad - es klappt nicht...

Ein Thema von Andreas13 · begonnen am 22. Jun 2019 · letzter Beitrag vom 23. Jun 2019
Antwort Antwort
Andreas13

Registriert seit: 14. Okt 2006
Ort: Nürnberg
711 Beiträge
 
Delphi XE5 Professional
 
#1

Von hard- auf softcodierten DB-Pfad - es klappt nicht...

  Alt 22. Jun 2019, 16:04
Datenbank: Absolute Database • Version: 7.91 • Zugriff über: embedded DB
Hallo Community,
ich benutze die neueste Version (7.91) von Absolute Database. Für die Entwicklungsphase setze ich die Tabellen-Eigenschaften generell z.B.
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

Geändert von Andreas13 (22. Jun 2019 um 16:06 Uhr)
  Mit Zitat antworten Zitat
Delphi.Narium

Registriert seit: 27. Nov 2017
2.415 Beiträge
 
Delphi 7 Professional
 
#2

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

  Alt 22. Jun 2019, 18:03
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 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 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.
  Mit Zitat antworten Zitat
peterbelow

Registriert seit: 12. Jan 2019
Ort: Hessen
672 Beiträge
 
Delphi 11 Alexandria
 
#3

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

  Alt 22. Jun 2019, 18:18
Hallo Community,
ich benutze die neueste Version (7.91) von Absolute Database. Für die Entwicklungsphase setze ich die Tabellen-Eigenschaften generell z.B.
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.
Peter Below
  Mit Zitat antworten Zitat
Andreas13

Registriert seit: 14. Okt 2006
Ort: Nürnberg
711 Beiträge
 
Delphi XE5 Professional
 
#4

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

  Alt 23. Jun 2019, 17:13
Vielen Dank für die wertvollen Tipps & Hinweise!
Gruß
Andreas
  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 13:46 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