Autor Beitrag
Tranx
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 648
Erhaltene Danke: 85

WIN 2000, WIN XP
D5 Prof
BeitragVerfasst: Mi 15.12.10 08:19 
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:

ausblenden Delphi-Quelltext
1:
2:
3:
4:
procedure TDatabase.CloseDataSets;
begin
  while (DataSetCount <> 0do 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.
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19321
Erhaltene Danke: 1749

W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Mi 15.12.10 08:32 
Theoretisch: ja
Praktisch: nein, da dadurch nur anderweitig Probleme durch unterschiedliche Unitversionen entstehen

Da DataSetCount aber eine public Eigenschaft ist, kannst du diese als Workaround ja selbst auf 0 setzen.

Eine Alternative wäre ein Hook auf CloseDataSets, der dies automatisch vorher erledigt. Das wäre allerdings nicht ganz so einfach.
Tranx Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 648
Erhaltene Danke: 85

WIN 2000, WIN XP
D5 Prof
BeitragVerfasst: Mi 15.12.10 08:42 
Gut, man kann DatasetCount auf Null setzen. Dennoch frage ich mich, wieso der Effekt auftrat. Das kann doch nicht wirklich an der Nichtzuordnung von Datasets zu Datasources liegen. Denn was ist, wenn man diese Zuordnung erst zur Laufzeit festlegt?

_________________
Toleranz ist eine Grundvoraussetzung für das Leben.