Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi BDE/Database Name (https://www.delphipraxis.net/57367-bde-database-name.html)

Sanguis 20. Nov 2005 03:37

Datenbank: Paradox • Version: 7 • Zugriff über: BDE

BDE/Database Name
 
Hi,
ich stehe momentan vor einem "Problem" bei dem ich wohl einfach nur den Wald vor lauter Bäumen nicht sehe.

Die Grundsituation sieht folgendermaßen aus:
Ich grefe per BDE auf Paradox Tabellen zu. In dem Programm gibt es um die 20 Formulare in denen jeweils mindestens 3 Query Komponenten sind, meist mehr. Ich muss ja in jeder Query Komponente den Pfad zur Datenbank angeben, unter Database Name. Das ist ansich auch kein Problem.
Nur gibt es jetzt neuerungen im Programm die es notwendig machen das sich der Pfad zur Datenbank ändern kann. Also nicht während der Ausführung sondern vorher. Wo der Pfad dann genau liegt, möchte ich über eine INI Datei einlesen.

Bis hierhin auch kein Problem.
Nur ist jetzt halt die Frage wie das "einfach" zu lösen ist. Muss ich jetzt beim Programmstart extra von Hand aus JEDE query Komponente einzeln ansprechen und den Wert ändern oder gibt es da eine einfachere möglichkeit durch irgend eine globale Weise den Wert für DatabaseName in allen Query Komponenten des Programms zu ändern?

Wenn ja, wäre es halt praktisch das ich mich dann nicht selbst darum kümmern müsste und so womglich auf manchen Formularen querys "vergesse". Flüchtigkeitsfehler können ja mal passieren.

Wie kann ich das am einfachsten und effektivsten lösen?
Vielen Dank schon im Vorraus.

Andy

r_kerber 20. Nov 2005 08:01

Re: BDE/Database Name
 
Moin Sanguis,

dann nimm zusätzlich eine TDatabase-Komponente und verwende einen BDE-Alias (BDE-Admin in der Systemsteuerung). Im Alias-Eintrag legst Du den Pfad fest. Die Query verwenden als DatabaseName denjenigen, den Du in TDatabase eingetragen hast. Nun bist Du völlig flexibel. Im Alias kannst Du den Pfad zur Datenbank ändern, falls diese mal verschoben wird. Und mit Hilfe der Tdatabase kannst Du sogar wahlweise auf verschiedene Datenbanken zugreifen (Test-, Produktions-DB), wenn für jede ein eigener Alias eingerichtet wurde. IMHO sollte es auch gehen, bei TDatabase unter der Eigenschaft AliasName den Pfad zu den Paradox-Tabellen einzutragen.

marabu 20. Nov 2005 08:33

Re: BDE/Database Name
 
Hallo Andy,

wie Rainer schon geschrieben hat, brauchst du eine TDatabase-Komponente. Um wirklich flexibel zu sein empfehle ich dir mit einer Kombination aus festem und temporärem Alias zu arbeiten. Angenommen dein Projekt heißt TEST, dann richtest du mit dem BDE Admin-Tool einen festen Alias TEST auf deiner Entwicklungsmaschine ein, damit deine Table- und Query-Komponenten mit dem Eintrag DatabaseName = TEST auch etwas anzeigen können, wenn du am Projekt arbeitest. In meinen BDE Projekten hatte ich immer eine Unit GLOBAL, in deren Initialisierungsteil ich etwa folgenden Code hatte:

Delphi-Quellcode:
const
  CALIAS = 'TEST';
  CDRIVER = 'STANDARD';

var
  WorkDir: string;
  dbWork: TDatabase;

initialization
  GetDir(0, WorkDir);
  WorkDir := IncludeTrailingPathDelimiter(WorkDir);

  Session.PrivateDir := TempDir;
  dbWork := TDatabase.Create(nil);
  dbWork.DatabaseName := CALIAS;
  dbWork.DriverName := CDRIVER;
  dbWork.Params.Add(Format('PATH=%s', [WorkDir]));
  dbWork.Connected := true;
finalization
  dbWork.Free;
end;
Das Datenbankverzeichnis wird dann in der Start-Verknüpfung deiner Anwendung als Arbeitsverzeichnis konfiguriert. Auf diese Weise muss auf der Zielmaschine der Alias nicht installiert werden - der Alias TEST ist dort ein temprärer. TempDir sollte auf ein Unterverzeichnis im Userprofil zeigen, falls sich auf der Zielmaschine mehrere Benutzer einloggen können.

Grüße vom marabu

Sanguis 21. Nov 2005 22:46

Re: BDE/Database Name
 
äh.. ehrlichgesagt verstehe ich das nicht so wirklich.
Wenn ich das ganze erst im BDE Manager einbinden muss, dann müsste der Enduser das ja auch tun. Und das wäre nicht "elegant". Lässt sich das nicht auch irgendwie leichter lösen?

Gibt es in Delphi keine Routine die "mal eben" alle query Komponenten im Projekt suchen und ändern kann? Das würde mir ja schon reichen, auch wenn es vielleicht nicht die sauberste Lösung wäre.

marabu 22. Nov 2005 07:15

Re: BDE/Database Name
 
Liste der Anhänge anzeigen (Anzahl: 1)
Zitat:

Zitat von Sanguis
Und das wäre nicht "elegant".

Zitat:

Zitat von Sanguis
Gibt es in Delphi keine Routine die "mal eben" alle query Komponenten im Projekt suchen und ändern kann?

Das ist widersprüchlich - meinst du nicht auch?

Die von mir (offensichtlich nicht gut genug) beschriebene Lösung IST elegant. Sie basiert auf der Vergabe eines temporären Alias für alle Query- und Table-Komponenten. Die Indirektion "Alias - Datenbankverzeichnis" wird erst zur Laufzeit aufgelöst. Nur für den Live-Modus der datensensitiven Komponenten (DBGrid) wird ein fester Alias auf der Entwicklungsmaschine benötigt. Das ist allerdings nicht zwingend und hängt vom Anwendungs-Design ab.

Die angehängte Demo-Anwendung soll dir zeigen, wie du vorgehen musst. Sie erwartet einen Alias SANGUIS auf deiner Entwicklungsmaschine. Wenn er existiert, kannst du das Projekt in der IDE ohne Fehler öffnen und siehst sofort die Country-Tabelle aus der Borland DBDEMO. Oder du kompilierst auf der Kommandozeile. Starten solltest du die kompilierte Anwendung dann über eine Verknüpfung, in der du das Arbeitsverzeichnis auf die DBDEMO-Daten einstellst.

Wenn das dich nicht überzeugen kann, dann wirst du tatsächlich über deine Forms iterieren und das Datenbankverzeichnis in alle TDataset-Komponenten fest eintragen müssen.

Freundliche Grüße vom marabu

r_kerber 22. Nov 2005 07:24

Re: BDE/Database Name
 
Zitat:

Zitat von Sanguis
äh.. ehrlichgesagt verstehe ich das nicht so wirklich.
Wenn ich das ganze erst im BDE Manager einbinden muss, dann müsste der Enduser das ja auch tun. Und das wäre nicht "elegant". Lässt sich das nicht auch irgendwie leichter lösen?

Dafür gibt's ja ein Installationsprogramm, das den Alias gleich mit einrichtet. Und der BDE-Admin wird IMHO bei der Installation auf den Rechner kopiert und ist dann in der Systemsteuerung zu sehen.

mschaefer 22. Nov 2005 07:51

Re: BDE/Database Name
 
Zitat:

Wenn ich das ganze erst im BDE Manager einbinden muss, dann müsste der Enduser das ja auch tun. Und das wäre
nicht "elegant". Lässt sich das nicht auch irgendwie leichter lösen?

Moin zusammen,

Also mit dem temporären Alias, dass ist ein Weg. es gibt zudem noch einen anderen:

1.:
a. Nimm die TDatabase-Komponente
b. Verbinde die Queries mit der TDatabse-Komponente
c. Verbinde Datsaource mit Queries und DB-Komponenten mit Datasource (bekannt)

2.:
a. Erstelle ein OnCreate-Ereignis im Mainform
b. Trage in die TDatabase den Pfad zur Datenbank im OnCreate ein:
Delphi-Quellcode:
 Database1.Database := ExtractFilePath(ExeName+'\Database')
c. Schalte die Queries auf enabled

Auf diesem Weg erhälst Du eine Applikation, wo die Datenbank in einem relativen Pfad zur Anwendung, im Unterverezichnis liegt und diese ist natürich auch beim Anwender in sein Wahlverzeichnis zu installieren. Nur die BDE muß halt installiert sein.

Grüße // Martin

Sanguis 25. Nov 2005 01:58

Re: BDE/Database Name
 
hm.. ich glaube das ist die Lösung die ich gesucht habe.
Nur.. steh ich schon wieder ein wenig auf dem Schlauch. Die TDatabase Komponente hab ich eingefügt. Aber wo genau kann ich sie mit den Querys verbinden? bzw. umgekehrt.

Im Objektinspektor kann ich die Komponente in keinem Feld auswählen um sie zu verknüpfen.

dfried 25. Nov 2005 07:18

Re: BDE/Database Name
 
Du musst in der TDatabase-Komponente im Property Databasename einen Namen eintragen. Danach kannst du bei den Queries/Tables dort diesen Name auch im Property Database aus der Liste auswählen und schon sind die zwei miteinander verbunden.

Sanguis 25. Nov 2005 21:45

Re: BDE/Database Name
 
Naja da fängt das Problem ja an.
Ich habe bisher den Pfad zur Datenbank in der Query unter "DatabaseName" eingegeben.
Wenn ich das bei der TDatabase Komponente jetzt genauso machen will, bekomme ich die Fehlermeldung "Doppelter Datenbankname" mit dem eingegebenem Pfad dahinter.

Weiterhin habe ich bei den Querys aber auch kein "Database" Property, sondern eben nur DatabaseName.

Ich steh ein wenig auf dem Logik Schlauch...


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