Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   FireDac Asynchron Abort (https://www.delphipraxis.net/213021-firedac-asynchron-abort.html)

Edelfix 10. Mai 2023 09:42

Datenbank: ADS • Version: 12 • Zugriff über: FireDac

FireDac Asynchron Abort
 
Hallo,

versuche gerade folgendes Beispiel: https://docwiki.embarcadero.com/RADS...rung_(FireDAC)

Jetzt möchte ich so einen asynchronen Aufruf vorzeitig abbrechen.

Mit FDQuery1.Close; gelingt mir das leider nicht.

Die Query wechselt in FDQuery1.Command.State = csPrepared

Wie komme ich wieder in den FDQuery1.Command.State = csInactive?

Der einzige Weg denn ich bis jetzt finden konnte ist FDQuery1.Connection.Close; Aber es muss einen anderen Weg geben.

Uwe Raabe 10. Mai 2023 09:45

AW: FireDac Asynchron Abort
 
Hast du denn schon AbortJob probiert?

Edelfix 10. Mai 2023 09:48

AW: FireDac Asynchron Abort
 
Oh. Hätte ich erwähnen sollen. Ja habe ich versucht. Leider auch ohne Erfolg. Es bleibt bei csPrepared

Uwe Raabe 10. Mai 2023 10:33

AW: FireDac Asynchron Abort
 
Welchen Zustand würdest du denn erwarten?

Uwe Raabe 10. Mai 2023 10:37

AW: FireDac Asynchron Abort
 
In der Regel kannst du von csPrepare durch den Aufruf Unprepare auf csInactive wechseln. Die Frage ist, warum du das Prepare später nochmal durchführen willst, wenn es doch schon erfolgreich war.

Edelfix 10. Mai 2023 13:29

AW: FireDac Asynchron Abort
 
Wenn eine Abfrage noch läuft und ich dann wieder in die Procedure gehe dann bekomme ich an folgender Stelle eine Exception:

Delphi-Quellcode:
FDQuery1.Close;
FDQuery1.SQL.Text := 'SELECT * FROM Table1'; // hier eine Exception wenn FDQuery1.Command.State = csPrepared

Uwe Raabe 10. Mai 2023 14:06

AW: FireDac Asynchron Abort
 
Auch bei AbortJob(True)? Es kann ja sein, dass der Abbruch intern etwas dauert.

Das Prepared ist aber auch so dokumentiert:
Zitat:

Die Methode AbortJob bricht eine der folgenden Datenmengenoperationen ab:
  • Open. Die Datenmenge führt eine DBMS-Anweisung zum Öffnen eines Cursors aus.
  • ExecSQL/Execute. Die Datenmenge führt eine DBMS-Anweisung aus.
  • Fetch. Die Datenmenge ruft Zeilen vom Cursor ab.
Nach einem Aufruf von AbortJob ist der Status Active der Datenmenge False und Prepared ist für Open/ExecSQL/Execute True. Der Status Active ist für Fetch True.

Edelfix 10. Mai 2023 14:16

AW: FireDac Asynchron Abort
 
Habe es jetzt so gelöst:

Delphi-Quellcode:
  FDQuery1.Close;
  if (FDQuery1.Command.State = csPrepared) then
    FDQuery1.Unprepare;
  if (FDQuery1.Command.State <> csInactive) then
  begin
    FDQuery1.Connection.AbortJob(true);
    FDQuery1.Connection.Close;
  end;
Scheint erst ein mal zu gehen. Danke.

Edelfix 14. Jun 2023 14:18

AW: FireDac Asynchron Abort
 
So richtig funktioniert es immer noch nicht.

Ich komme einfach nicht zu csInactiv.

Mit
Delphi-Quellcode:
FDQuery1.Connection.AbortJob(true);
komme ich von csExecuting zu csOpen.

Mit
Delphi-Quellcode:
FDQuery1.Connection.Close;
kommt die Exception: [FireDAC][Comp][Clnt]-326. Ausführen der Aktion nicht möglich, weil die vorherige Aktion noch nicht abgeschlossen ist

Wenn ich diese mit try except einklammere dann habe ich danach den Status csOpen und nicht wie gewünscht csInactiv.

Die Connection lässt sich nicht schließen.

Uwe Raabe 14. Jun 2023 14:42

AW: FireDac Asynchron Abort
 
Gemäß Beschreibung sollte das aber eigentlich funktionieren.

Kannst du das mit einem Beispielprojekt reproduzieren? Dann würde ich das mal mit der aktuellen Delphi Version probieren.


Alle Zeitangaben in WEZ +1. Es ist jetzt 08:40 Uhr.
Seite 1 von 2  1 2      

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz