Bei
ADO Komponenten muss man folgende Regeln beachten!
1.) es darf nur eine einzige ADOConnection pro Datenbank geben
...
Das ist bei nie ein Problem gewesen. Aber deine weiteren Ausführungen sind entscheidend!
Ich erschlage sie mit GExperts: Dort kann man einstellen, das Delphi vor dem Compilieren dafür sorgt, das alle Connections und Datasets geschlossen sind (Set Component Properties).
Warum man nur eine Connection haben sollte, würde mich mal interessieren.
Zum Problem: Abfragen auf true/false = unnötig und gefährlich. (mehr unnötig als gefährlich)
Das löst aber nicht das Problem, sieht aber hübscher aus.
Delphi-Quellcode:
if ReadDSNFromRegistry(DSN) then begin
if DataModule1.SetMinervaDSN(DSN) then
Der folgende Code aus Post #1 soll dein 'SetMinervaDSN' sein? So ist es moderner:
Delphi-Quellcode:
Result := true;
if Datenbank.Connected then
if not CloseDatabase then begin
Result := false;
Exit;
end;
Datenbank.ConnectionString := DSN;
Ich hatte solange die gleichen Probleme wie Du, bis ich die 5 Regeln (na ja, 2-5) strikt durch Verwendung der GExperts eingehalten habe.
Bin ich auf einem fremden Delphi ohne GExperts, knallt mir das jedesmal um die Ohren.
Das seltsame daran ist doch eigentlich dass ich die prinzipielle Vorgehensweise schon
mehrmals eingesetzt habe. Nur diesmal geht irgendwas schief...
Das klingt genauso wie wenn meine Programmierer vor der rauchenden Maschine stehen und sagen: "Ich hab eigentlich nix gemacht!"
Das Schöne an unserem Beruf ist doch: So eine SW ist deterministisch. Wenn's gestern lief und heute nicht, ist nicht das Wetter oder die Stimmung Schuld, sondern das gottverdammte System.
Du wirst zur Designzeit irgendwo rumgeklickelt haben, oder Delphi von mir aus von ganz alleine oder ein Kobold.
Sorge stringent dafür, das beim Start des Programms alle Verbindungen und Datasets tot sind (Lade GExperts oder verwende Bummis Trick, wobei der 'nur' meckert, was aber auch ok ist)
Noch ein Trick (auch bei Datasnap oder
TCP): Suche per Explorer (Totalcommander, egal) in den (Text-)
DFM-Dateien nach "Connected=True" oder "Active=True" usw. Wenn ich eine Stelle gefunden habe, war ich mir jedesmal sicher, das ich das unter Delphi geprüft hatte.
Merke: Je komplexer die
IDE, desto mehr unsichtbare Kobolde frickeln an deinem Code rum