Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi Datenmodul alle Queries in einem schliessen (https://www.delphipraxis.net/211970-datenmodul-alle-queries-einem-schliessen.html)

josef-b 27. Nov 2022 17:37

Datenbank: Firebird • Version: 3.0 • Zugriff über: IBExpress

Datenmodul alle Queries in einem schliessen
 
Ich habe ein Datamodul mit vielen TIBQuery.

Nun möchte ich beim oncreate des Datamoduls alle Transactionen schliessen.

Dazu habe mir folgenden Code vorgestellt ;-)

Delphi-Quellcode:
for i := 0 to Datenmodul.ComponentCount - 1 do
  begin
  if Datenmodul.Components[i] is TIBQuery then
    begin
    AQuery := Datenmodul.Components[i] as TIBQuery;
    if Aquery.Transaction.InTransaction then AQuery.Transaction.Commit;
    end;
  end;
end;
es wird fehlerfrei compiliert, aber gleich in der ersten Zeile mit dem ComponentCount bekomme ich
eine AV Zugriffsverletzung.

Funktioniert das evtl gar nicht im Datamodul?

hoika 27. Nov 2022 18:02

AW: Datenmodul alle Queries in einem schliessen
 
Ja,
im OnCreate macht das keinen Sinn.
Die Transaktionen wurden doch noch gar nicht erzeugt,
weil es das DataModul noch gar nicht gibt ...

Uwe Raabe 27. Nov 2022 18:58

AW: Datenmodul alle Queries in einem schliessen
 
Beim OnCreate des DatenModuls ist die Variable DatenModul vermutlich noch nicht zugewiesen.

dataspider 28. Nov 2022 10:38

AW: Datenmodul alle Queries in einem schliessen
 
Ich benutze dafür lieber AfterConstruction:

Delphi-Quellcode:
type
  TDMDeinDatenModul= class(TDataModule)
  ...
  public
    procedure AfterConstruction; override;
  ...
implementation
  ...
procedure TDMDeinDatenModul.AfterConstruction;
begin
  inherited;
  // hier deinen Code
end;
Frank

BerndS 28. Nov 2022 10:44

AW: Datenmodul alle Queries in einem schliessen
 
Es würde ja schon reichen, Datenmodul wegzulassen. Self ist ja das Datenmodul, welches der Variable Datenmodul nach dem Create zugewiesen wird.
Delphi-Quellcode:
for i := 0 to ComponentCount - 1 do
begin
  if Components[i] is TIBQuery then
  begin
    AQuery := TIBQuery(Components[i]);
    if Aquery.Transaction.InTransaction then
      AQuery.Transaction.Commit;
  end;
end;

dataspider 28. Nov 2022 10:50

AW: Datenmodul alle Queries in einem schliessen
 
Ich frag mich nur, welchen Grund es geben kann, beim Create Transactions zu commiten. Hätte ich eher im BeforDestruction vermutet...

Uwe Raabe 28. Nov 2022 11:30

AW: Datenmodul alle Queries in einem schliessen
 
Zitat:

Zitat von BerndS (Beitrag 1515487)
Es würde ja schon reichen, Datenmodul wegzulassen. Self ist ja das Datenmodul, welches der Variable Datenmodul nach dem Create zugewiesen wird.

Das gilt aber nur, wenn der Eventhandler auch in dem Datenmodul liegt. Er kann aber auch in jeder anderen Objektinstanz verdrahtet sein. Dann wäre Sender die bessere Alternative, wenn auch mit einem Cast.

josef-b 28. Nov 2022 15:05

AW: Datenmodul alle Queries in einem schliessen
 
Zitat:

Zitat von dataspider (Beitrag 1515488)
Ich frag mich nur, welchen Grund es geben kann, beim Create Transactions zu commiten. Hätte ich eher im BeforDestruction vermutet...

Das möchte ich machen, weil man manchmal in der Entwicklungs-Zeit die Transaktionen offen hat, obwohl die Query geschlossen ist.

Wenn du dann Compilierst sind die immer noch offen.

Und wenn du dann die Query schliesst und bei mir ist im AfterClose der Query das Commit oder CommitRetaining beim TIBDataset, dann kommt eben am Anfang das Commit nicht...

Und dann arbeitest du teilweise mit nicht aktuellen Daten...

Deshalb möchte ich sicher sein, dass erstmal alle Transaktionen inaktiv sind.

dataspider 28. Nov 2022 15:19

AW: Datenmodul alle Queries in einem schliessen
 
Also, wenn in der Zeile "for i := 0 to Datenmodul.ComponentCount - 1" eine AV kommt, würde ich zuerst im Debugger Datamodul anzeigen lassen.
Das ist dann wahrscheinlich nil.

Frank

haentschman 28. Nov 2022 16:27

AW: Datenmodul alle Queries in einem schliessen
 
Zitat:

weil man manchmal in der Entwicklungs-Zeit die Transaktionen offen hat
...Sorry, in der Entwicklung (OI) Connection.Active = True , ist aber imho ein NoGo. :warn: :zwinker:

PS:
Ich arbeite auch mit Transaktionen. Wenn mein Programm "abschmiert" wegen Blödsinn im Quelltext, sollten damit auch die Connections geschlossen sein. Und damit sollten die Transaktionen, die zu den Connections, gehörten auch weg sein...Das regelt die Datenbank selbst. :wink:


Alle Zeitangaben in WEZ +1. Es ist jetzt 15:38 Uhr.
Seite 1 von 2  1 2      

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