Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi Verbindungsverlust zur Datenbank (https://www.delphipraxis.net/112744-verbindungsverlust-zur-datenbank.html)

haentschman 26. Apr 2008 06:28

Datenbank: firebird • Version: 2.0 • Zugriff über: zeos

Verbindungsverlust zur Datenbank
 
guten Morgen... :hi:

ich habe mal eine Prinzipfrage:

Ich arbeite mit Zeos. Wenn einer den Netzwerkstecker ziehen würde wäre die Connection trotzdem immer noch Connected = True und es wird kein Ereignis ausgelöst.

:?: Wie geht man am schlauesten an diese Problematik ran

- zyklisch mit einem Timer eine Query absetzen und gucken ob was kommt ( Intervall ? ) --> event. dann Connect
- vor jeder Query Connection Prüfen ? --> event. Connect ( was ne Arbeit :shock: )

Freue mich auf Eure Hinweise...

alzaimar 26. Apr 2008 07:06

Re: Verbindungsverlust zur Datenbank
 
Ich verwende zwar kein Zeos, aber prinzipiell mache ich es so, das ich vor jeder Datenbankaktion eine Verbindungsprüfung einbaue, also so etwa:
Delphi-Quellcode:
...
  CheckConnection;
  MyDBCommand.Execute;
...
Und die Methode 'CheckConnection' schickt ein 'select 1' zum Server. Wenn das knallt und die Exception mir sagt, das die Verbindung unterbrochen wurde (und nur dann!), baue ich sie wieder auf (1 Versuch). Wenn das nicht klappt, ist eh Hopfen und Malz verloren und ich melde eine Exception, das die DB nicht erreichbar ist.

SQL-Code:
Procedure TMyDataModule.CheckConnection;
  Procedure _TryConnection;
  Begin
    MyConnection.Connected := True;
    MyConnection.executeI('select 1');
  End;

Begin
  Try
    _TryConnection;
  Except
    On E:EConnectionLostConnection Do
      _TryConnection;
    On E:Exception Do Raise E;
  End
End;

haentschman 26. Apr 2008 12:58

Re: Verbindungsverlust zur Datenbank
 
Danke für den Tip.

Zitat:

das ich vor jeder Datenbankaktion eine Verbindungsprüfung einbaue
... ich dachte mir schon, daß es darauf hinausläuft. An die Arbeit darf ich gar nicht denken. :(

...was kostets mehr, wenn man es gleich richtig macht :wink:

bis bald...

Peinhard 26. Apr 2008 15:05

Re: Verbindungsverlust zur Datenbank
 
Ich würde in so einem Falle immer versuchen, das direkt in die Komponenten 'hineinzumogeln', in sowas wie DoBeforeOpen bspw.

alzaimar 26. Apr 2008 16:46

Re: Verbindungsverlust zur Datenbank
 
Naja,
Zitat:

Zitat von haentschman
... ich dachte mir schon, daß es darauf hinausläuft. An die Arbeit darf ich gar nicht denken. :(

Dann hast Du etwas falsch gemacht. Normalerweise zentralisiert man Zugriffe auf ein externes System in einem Datenmodul o.ä. Dann halten sich die vorzunehmenden Änderungen nämlich in Grenzen. Ich habe z.B. alle Zugriffe auf das RDBMS in einer einzigen Methode 'Execute', und da ist o.g. Erweiterung ein Klacks.

Ganz grausam ist, für jede Anweisung eine eingene DB-Komponente zu verwenden und diese kreuz und quer in der Anwendung zu verteilen.

Ich kann z.B. ein TDataset mit einer SELECT-Anweisung auch so füllen:

Delphi-Quellcode:
Procedure TMyForm.OnCreate;
Begin
  FMyDataset := MyDatamodule.CreateDataSet ('Select * from Tabelle'); // privates Feld des Formulares.
  FDataSource.Dataset := FMyDataset;
  MyDataGrid.Datasource := FDataSource;
End;

Procedure TMyForm.OnDestroy;
Begin
  FreeAndNil (FMyDataset);
End;
'CreateDataset' prüft die Verbindung (und setzt ggf. neu auf) und liefert ein Dataset mit den Daten.

haentschman 26. Apr 2008 17:13

Re: Verbindungsverlust zur Datenbank
 
Zitat:

Dann hast Du etwas falsch gemacht.
... ja sicher :wink:

Zitat:

Ganz grausam ist, für jede Anweisung eine eingene DB-Komponente zu verwenden
... ganz so schlimm bin ich dann doch nicht :mrgreen:

Ich habe versucht, die offenen Querys auf das notwendige zu beschränken (z.B. Visualisierungen im DBGrid), es bleiben aber eine Menge übrig.
Über Zentralisierung der Querys (besonders beim Schreiben) hatte ich nachgedacht, aber keine vernünftige Lösung gefunden, wie ich die Prozedur lexibel aufbaue. (Parameter zwischen 0 und ca. 20).

Erst mal funktionsfähig ( die Uhr tickt :wink: )...dann Optimierung.


Danke für Eure Infos...


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