Datenmodul mit Connected=True

12/09/2007 - 09:39 von Matthias Hanft | Report spam
Hallo,

für den Zugriff auf eine bestimmte Datenbank baue ich üblicher-
weise ein (zur Laufzeit dynamisch erzeugtes) Datenmodul, in dem
sich eine IBDatabase befindet, deren Eigenschaft "Connected"
bereits zur Entwicklungszeit auf "True" steht - dann spare ich
mir das Öffnen zur Laufzeit.

Das funktioniert auch ganz wunderbar, allerdings bin ich mir
nicht sicher, ob das der richtige Weg ist, wenn zur Laufzeit
ein Fehler beim Öffnen der Datenbank passiert (z.B. Datenbank-
server nicht erreichbar o.à.). Ich vermute, die dann fàllige
Exception passiert beim Anlegen des Datenmoduls?, so daß ich
dann wohl schreiben müßte

try
myDataModule:=TMyDataModule.Create(nil);
try
myDataModule.TuWas
except
// Fehlerbehandlung für TuWas-Fehler
end;
myDataModule.Free
except
// Fehlerbehandlung für Datenbank-Öffnen-Fehler;
// .Free nicht nötig, da wegen Exception bei Create
// gar nicht erst angelegt
end;

Stimmt das so richtig?

Zusatzfrage: Was wàre, wenn man in TMyDataModule.OnCreate z.B.
eine TStringList anlegen (und in .OnDestroy freigeben) würde?
Speicherleck, oder funktioniert automagisch? (Im letzteren
Fall: Lebt die TStringList ein paar Millisekunden lang, oder
würde sie gar nicht erst geboren?)

Die gleiche Frage für den Fall, daß man einen eigenen Construc-
tor baut, und darin z.B. schreibt

inherited Create(nil);
FStringList:=TStringList.Create;

und einen eigenen Destructor

FStringList.Free;
inherited Destroy;

und dann beim Create auf die Datenbank nicht zugegriffen werden
kann - klappt?, oder Probleme? Lebt die TStringList mal kurz?

Oooooder sollte man solche Dinge grundsàtzlich vermeiden, indem
man zur Entwicklungszeit Connected=False setzt, das Create dadurch
(i.d.R.) niemals schiefgehen làßt und dem Datenmodul eine Property
Connected spendiert, die der aufrufende Prozeß nach dem (i.d.R.
immer erfolgreichen) Create prüfen kann?

Wie ist da der "gute" Programmierstil?

Danke & Gruß Matthias.
 

Lesen sie die antworten

#1 Marian Aldenhövel
12/09/2007 - 10:19 | Warnen spam
Hi,

Zusatzfrage: Was wàre, wenn man in TMyDataModule.OnCreate z.B.
eine TStringList anlegen (und in .OnDestroy freigeben) würde?
Speicherleck, oder funktioniert automagisch?



Wenn Du in OnCreate etwas anlegst und in OnDestroy freigibst, dann
ist das korrekt.

(Im letzteren
Fall: Lebt die TStringList ein paar Millisekunden lang, oder
würde sie gar nicht erst geboren?)



In diesem speziellen Fall bekàmst Du wohl gar kein OnCreate. Das
müsstest Du aber ausprobieren.

Ein OnDestroy() bekàmst Du aber, da es aus dem - dann automatisch
aufgerufenen - Destruktor heraus ausgelöst wird.

Es gilt für OnDestroy-Handler also dasselbe wie für alle Destruktoren:
Du kannst Dich nicht darauf verlassen, daß sie immer auf einem korrekt
initialisierten Objekt aufgerufen werden. Es kann auch ein Rohbau sein,
weil der Konstruktor auf halber Strecke eine Exception ausgelöst hat.

Ein

FreeAndNIL(FDieStringListe)

ist also korrekt, jedenfalls unter der Annahme, daß FDieStringListe ein
Objektfeld ist, also vor dem Konstruktor-Aufruf zu NIL initialisiert
war.

Etwas wie:

FDieStringListe.SaveToFile(..);
FreeAndNIL(FDieStringListe);

Wàre nicht korrekt, das SaveToFile() kann man auf NIL nicht ausführen, also

if FDieStringListe<>NIL then
begin
FDieStringListe.SaveToFile()...
FreeAndNIL(FDieStringliste);
end;

Oooooder sollte man solche Dinge grundsàtzlich vermeiden, indem
man zur Entwicklungszeit Connected=False setzt, das Create dadurch
(i.d.R.) niemals schiefgehen làßt und dem Datenmodul eine Property
Connected spendiert, die der aufrufende Prozeß nach dem (i.d.R.
immer erfolgreichen) Create prüfen kann?



Ich mache das so.

Vor allem weil das Programm so vor der Aufnahme der Verbindung die
Datenbankverbindung (Server- und DB-Name etc.) noch konfigurieren
und dann erst explizit verbinden kann.

Ein Indiz dafür, daß das allgemein eine gute Idee und kein Spleen von
mir ist besteht darin, daß viele 3rd-Party Komponenten inzwischen eine
Eigenschaft wie AllowStreamedConnected:boolean mitbringen, mit der
man ein Connected=True in der Formularresource effektiv vermeidet.
Sonst vergisst man das ja schon mal leicht :-).

Ciao, MM
Marian Aldenhövel, Rosenhain 23, 53123 Bonn
http://www.marian-aldenhoevel.de
"Success is the happy feeling you get between the time you
do something and the time you tell a woman what you did."

Ähnliche fragen