Hallo,
wollte nur mal über einen sehr merkwürdigen Effekt berichten.
Ich programmiere Programme, welche Access-Datenbanken über ODBC ansprechen (Es geht jetzt nicth um die Langsamkeit der Anwendung!). Ich habe eine Routine für Afterconnect geschrieben. Es sollen alle Tabellen geöffnet werden, welche der Datenbank zugeordnet wurden.
Jetzt trat der Fehler auf, dass das Programm im Nirvana verschwand. Und der zeigte sich - nach langem Suchen - in der Unit DBTables:
Delphi-Quelltext
1: 2: 3: 4:
| procedure TDatabase.CloseDataSets; begin while (DataSetCount <> 0) do TDBDataSet(DataSets[DataSetCount-1]).Disconnect; end; |
Bei einer Datenbank wurde der Zähler Datasetcount einfach nicht heruntergezählt, so dass eine Endlosschleife entstand.
Und jetzt kommt der Grund: Ich habe daraufhin das Datenmodul untersucht. Dabei habe ich festgestellt, dass zwei Datasources keine Datasets zugeordnet waren. Ich habe den Datasources die entsprechenden Datasets zugeorndet und - das Programm arbeitete ohne Probleme die Prozedur ab!
Das Merkwürdige ist neben der Tatsache, dass Dataset und Datasource ja zweierlei Dinge sind (Dataset wird geschlossen, Datasource nicht), die Tatsache, dass die nicht zugeordneten Datasets zu den Datasources gar nicht zu der Datenbank gehörten, die Probleme bereitete. Anmerkung: In dem Programm habe ich drei Datenbanken aktiv.
Ich denke, dass ist ein prinzipieller Fehler in der Unit DBTables (Version Delphi 5). Hier sollte - um Endlosschleifen zu vermeiden, ein Abbruchkriterium eingebaut werden.
Frage: Kann man die Unit nachträglich - mit geänderter CloseDatasets-Prozedur - kompilieren, so dass solche Fehler abgefangen werden?
Toleranz ist eine Grundvoraussetzung für das Leben.