![]() |
Datenbank: FB • Version: 2.0 • Zugriff über: IBX
Datenbankverbindung bei Programmstart
Hallo alle,
ich möchte die Datenbankverbindung beim Programmstart (je nach aktuellem Programmordner) festlegen und öffnen. Gibt es eine elegante Möglichkeit, die Datenbankverbindung beim Programmstart IMMER auszustellen - für den Fall dass man vergisst, diese vor dem compilieren zu schließen? Sonst würde ja beim Programmstart immer versucht werden, eine evtl. nicht vorhandene Datenbank zu öffnen. Stahli |
Re: Datenbankverbindung bei Programmstart
Erstelle ein Datenmodul und implemnetiere das Setzen der Pfade und das Öffnen in dessen DataModulCreate-Event-Methode
|
Re: Datenbankverbindung bei Programmstart
Ja, aber dann muss ich die bestehende Verbindung in der IDE vor der Kompilierung ja unbedingt ausschalten.
Sonst würde bei Auslieferung des Projektes beim Nutzer ja ein Fehler auftreten bevor die Create-Methode des DataModuls abgearbeitet wird wenn die Datenbank nicht im selben Ordner wie bei meiner Entwicklungsumgebung vorliegt. Lässt sich aber vermutlich nicht vermeiden, oder? Stahli |
Re: Datenbankverbindung bei Programmstart
Hallo,
das Datenmodul ist ein schönes Hilfsmittel zur Code-Organisation. Der korrekte Verbindungsaufbau lässt sich über das Ereignis OnBeforeConnect() der Komponente TIBDatabase steuern. Freundliche Grüße |
Re: Datenbankverbindung bei Programmstart
Danke, das hätte ich natürlich auch selbst finden können :oops:
Man muss zwar für eine Ersatzverbindung sorgen und kann das Öffnen nicht direkt abbrechen, das reicht mir aber so auch aus. Stahli |
Re: Datenbankverbindung bei Programmstart
Hallo,
du kannst den Verbindungsaufbau über eine silent exception (Abort) abbrechen, er kann aber auch einfach scheitern. Beides kannst du in einem exception handler abfangen. Auf eine Default-Verbindung kannst du verzichten, wenn dein Programm dem Benutzer den Aufbau zu einer beliebigen Datenbank über den Öffnen-Befehl im Datei-Menü erlaubt. Wenn der Benutzer mit verschiedenen Datenbanken arbeitet, dann ist eine MRU-Liste im Datei-Menü ein gern gesehenes Komfortmerkmal. Freundliche Grüße |
Re: Datenbankverbindung bei Programmstart
Zitat:
Delphi-Quellcode:
Genauso gut könnte man einen FileDialog nehmen oder sogar den unvermeidlichen DAU den DB-Namen von Hand eingeben lassen. :stupid: Ist aber zu riskant, deshalb mit INI. :mrgreen:
procedure TDM.DataModuleCreate(Sender: TObject);
var Ini : TIniFile; begin Ini := TIniFile.Create (ExtractFilePath (ParamStr (0)) + 'DB.INI'); if not CDStart then DatenBankName := Ini.ReadString('Datenbank','Name',ExtractFilePath (ParamStr (0))+'db\db.fdb') else // falls INI nicht vorh. usw. ^^ DatenBankName := ExtractFilePath (ParamStr (0)+'db\db.fdb'); DataBase.Close; // <--- Einstellungen im OI ab hier völlig egal. DataBase.DatabaseName := DatenBankName; DataBase.Open; ReadTransaction.Active := true; Ini.free; end; |
Re: Datenbankverbindung bei Programmstart
Zitat:
Marabu's Lösung ist der einzige Weg. Im BeforeConnect Event kann mittels abort eine Verbindung unterbunden werden. Problem ist erstmal, dass somit natürlich jede Verbindung unterbunden wird, auch die nachher im Programm manuell zu öffnende. Es lässt sich aber leicht im BeforeConnect über ein Tag entscheiden, ob die Verbindung abgebrochen werden soll oder nicht. z.B. einfach so:
Delphi-Quellcode:
procedure TForm1.ADOConnection1BeforeConnect(Sender: TObject);
begin if tag=0 then abort; end; procedure TForm1.FormCreate(Sender: TObject); begin self.Tag := 1 ; end; procedure TForm1.Button1Click(Sender: TObject); begin self.ADOConnection1.Connected := true ; self.ADOQuery1.open; end; |
Re: Datenbankverbindung bei Programmstart
Zitat:
Zitat:
Will ich nun verschiedene DBs testen, dann wird der Name in der INI geändert (zu diesem Zweck von mir mit Editor). Wieso soll das nicht gehen, bzw. warum noch überflüssiges einbauen ? :shock: Sofern das FB-Umfeld stimmt, ändere ich z.B. in der INI "C:\DB\DB.FDB" auf "F:\DB\DB.FDB" und schon wird die DB auf externem Netzwerk-Server benutzt und nicht die lokale. So was kommt oft vor und geht bisher immer. Warum soll das so nicht gehen ??? :shock: Edit : das "völlig egal" im Source-Kommentar bezieht sich auf den DB-Namen !! Nicht auf User, passwort usw. !! |
Re: Datenbankverbindung bei Programmstart
Zitat:
|
Re: Datenbankverbindung bei Programmstart
Dann könnt er ja auch den Create Constructor des Datenmoduls überschreiben, das müßte dann ja noch früh genug sein oder bin ich da am Holzweg?
|
Re: Datenbankverbindung bei Programmstart
Liste der Anhänge anzeigen (Anzahl: 1)
Habe hier alles mit Kollege nochmals 2 St. getestet. Wer weiß. 8) Netzwerk, Win98 usw. Fehler : keine. Wer will, kann das testen (siehe Anhang). Voraussetzung : FB ab 1.0. Zip entpacken nach C:\Jelly> . Jelly, nichts für ungut, war halt naheliegend.
Source : zumindest FIBplus-Trial wird gebraucht. Oder TpFIB-Prefixe in IB-Prefixe für IBX umbenennen und neu compileren. Im Jelly-Verzeichnis ist eine DB.INI, wie beschrieben. Dort ist ein Datenbank-Ort beschrieben. Standardmäßig bei C:\Jelly. Die DB heißt "Test.FDB". Eine zweite ist dabei. "Test2.FDB". Sind diese zwei DB-Dateien in zwei Ordnern und die INI wird dementsprechend angepasst, dann müsste die EXE eigentlich Daten aus diesen verschiedenen Datenbanken anzeigen. Es wird immer der erste Datensatz angezeigt. 111 oder nach Änderung der INI auf die andere Datei 98765432. Beim Programmstart kommt eine showmessage, die noch die benutzte DB anzeigt. Was soll da nicht gehen ? :zwinker: |
Re: Datenbankverbindung bei Programmstart
Also, während ich noch IBX Komponenten genutzt habe (bis Version 5.42) gabs zum einen die Property TIBDatabase.StreamedConnect, welche dann entschieden hat ob eine zur Designtime aktive Virbindung auch bei kompilierung aktiv ist/bleibt.
Zum anderen gabs eine Kompo INI...irgendwas mit der man eine INI Datei angeben konnte die die Verbindungsparameter enthält und bei erstellung einer TIBDatabase instanz at Runtime ausgelesen wurde. Glaube das Package hiess IBXtra oder so. Hier ist ein link ![]() |
Re: Datenbankverbindung bei Programmstart
Zitat:
Werd dein Beispiel aber dennoch mal testen. |
Re: Datenbankverbindung bei Programmstart
Guten Morgen,
die von webcss beschriebene Eigenschaft gibt es - allerdings heißt sie bei mir AllowStreamedConnected. Wenn ich die Regel-Verbindung beim Ereignis OnBeforeConnect() aufbaue, brauche ich diese property nicht. Sie ist sicher hilfreich, wenn man die Verbindungsparameter an einer weniger geeigneten Stelle konfiguriert. Wenn man den Komfort einer Konfigurationsdatei genießen möchte, dann genügt eigentlich IBDatabase.Params.LoadFromFile() oder ini.ReadSectionValues(ConnectionName, IBDatabase.Params). Freundliche Grüße |
Re: Datenbankverbindung bei Programmstart
Bei den ODAC (Oracle) Komponenten gibt es eine Property NeverConenct. Damit ist es egal ob du beim compilieren verbunden bist oder nicht. Ich weiss nicht mit welcher Datenbank und Komponenten du arbeitest, aber eventuell gibt es bei dir sowas auch.
Gruss Olli |
Re: Datenbankverbindung bei Programmstart
Zitat:
So, dann werde ich das gleich doch mal mit IBX testen. Mal sehen. 8) |
Re: Datenbankverbindung bei Programmstart
Also dann leg ich mal parallel hier mein Gegenbeispiel hin. Die AdoConnection1 ist zur Designzeit auf active. Die Verbindung steht in meinem Fall zu einem MSSQL Server.
Die Verbindung soll dann anschliessend durch einen Buttonklick gemacht werden. Stoppe ich den SQL Server Service und starte die Anwendung, fliegt mir die Fehlermeldung um die Ohren. ![]() Und das obwohl im OnCreate der Form die ADOConnection geschlossen wird.
Delphi-Quellcode:
unit Unit19;
interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, Grids, DBGrids, DB, ADODB, StdCtrls; type TForm19 = class(TForm) ADOConnection1: TADOConnection; ADOQuery1: TADOQuery; DataSource1: TDataSource; DBGrid1: TDBGrid; Button1: TButton; procedure FormCreate(Sender: TObject); procedure Button1Click(Sender: TObject); private { Private declarations } public { Public declarations } end; var Form19: TForm19; implementation {$R *.dfm} procedure TForm19.Button1Click(Sender: TObject); begin try self.ADOConnection1.Connected := true ; self.ADOQuery1.open; except MessageDlg('No connection', mtWarning, [mbOK], 0); end; end; procedure TForm19.FormCreate(Sender: TObject); begin self.ADOConnection1.Connected := false ; end; end. |
Re: Datenbankverbindung bei Programmstart
Liste der Anhänge anzeigen (Anzahl: 1)
Wer benutzt denn schon ADO ? Kein Wunder wenn so was kommt. :mrgreen:
Habe FIBplus komplett rausgeschmissen und mit IBX - Komponenten ersetzt. Im Anhang ist alles dabei. In der IDE steht alles auf connected bzw. active ist true. "Datenbankverbindung bei Programmstart" wird mit der INI geregelt. Nur zur Wiederholung. Genauere Bedienung wie vorher, siehe weiter oben. Wo geht jetzt was nicht ? :P Edit : natürlich Anhang vergessen. :stupid: |
Re: Datenbankverbindung bei Programmstart
Sorry, kann deine Anwendung nicht testen, da ich noch nicht mal mit IBExpert eine Verbindung zur Datenbank hinkriege.
|
Re: Datenbankverbindung bei Programmstart
oups, hab gar nicht gemerkt, dass hier weiter diskutiert wurde...
(und hier im Dienst kann ich die Beispiele auch nicht ansehen) Eigentlich habe ich mein Problem ja auch schon durch BeforeConnect im Griff. Was Jelly gschrieben hat, traf mein Problem genau auf den Punkt. Nur eine Vermutung, wo vielleicht das Mißverständnis mit Hansa bestand: Ich könnte mir vorstellen, dass man das DataModul vielleicht als erstes erzeugen muss (vor den Formularen) und sich dann im OnCreate die Datenbankverbindung noch "rechtzeitig" schließen lässt. (Wie gesagt, kann es hier nicht richtig testen.) Stahli |
Re: Datenbankverbindung bei Programmstart
Zitat:
Delphi-Quellcode:
Da werden völlig überflüssige Workarounds gebaselt, bis es eben doch passt.
begin
Application.Initialize; Application.CreateForm(TDataModule1, DataModule1); Application.CreateForm(TForm1, Form1); Application.Run; end. So ähnlich, wie einer, der den Schlüssel in der Wohnung liegen hat und der herbeigerufene Schlüsseldient kriegt die Tür nicht auf, obwohl sie sowieso auf war und der Nachbar stützt sich irgendwann mal aus Versehen auf die Türklinke. :lol: :mrgreen: |
Re: Datenbankverbindung bei Programmstart
Hallo Hansa,
manchmal löse ich Probleme, die gar nicht existieren - ist dir das auch schon mal passiert? Freundliche Grüße |
Re: Datenbankverbindung bei Programmstart
@marabu und Hansa: Danke auf jeden Fall für die Mühewaltung! ;-)
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 18:39 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