![]() |
Datenbank: ADS • Version: 12 • Zugriff über: FireDac
FireDac Asynchron Abort
Hallo,
versuche gerade folgendes Beispiel: ![]() 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. |
AW: FireDac Asynchron Abort
Hast du denn schon
![]() |
AW: FireDac Asynchron Abort
Oh. Hätte ich erwähnen sollen. Ja habe ich versucht. Leider auch ohne Erfolg. Es bleibt bei csPrepared
|
AW: FireDac Asynchron Abort
Welchen Zustand würdest du denn erwarten?
|
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.
|
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 |
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:
|
AW: FireDac Asynchron Abort
Habe es jetzt so gelöst:
Delphi-Quellcode:
Scheint erst ein mal zu gehen. Danke.
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; |
AW: FireDac Asynchron Abort
So richtig funktioniert es immer noch nicht.
Ich komme einfach nicht zu csInactiv. Mit
Delphi-Quellcode:
komme ich von csExecuting zu csOpen.
FDQuery1.Connection.AbortJob(true);
Mit
Delphi-Quellcode:
kommt die Exception: [FireDAC][Comp][Clnt]-326. Ausführen der Aktion nicht möglich, weil die vorherige Aktion noch nicht abgeschlossen ist
FDQuery1.Connection.Close;
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. |
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. |
AW: FireDac Asynchron Abort
Es muss ein SQL Request sein der länger dauert. Wenn man dann wie wild auf Button1 klickt dann kommt eine Exception.
Eine Datenbank einbinden und sonst ein Beispiel:
Delphi-Quellcode:
DFM:
unit Unit1;
interface uses Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics, Vcl.Controls, Vcl.Forms, Vcl.Dialogs, FireDAC.Stan.Intf, FireDAC.Stan.Option, FireDAC.Stan.Error, FireDAC.UI.Intf, FireDAC.Phys.Intf, FireDAC.Stan.Def, FireDAC.Stan.Pool, FireDAC.Stan.Async, FireDAC.Phys, FireDAC.VCLUI.Wait, FireDAC.Stan.Param, FireDAC.DatS, FireDAC.DApt.Intf, FireDAC.DApt, Data.DB, FireDAC.Comp.DataSet, FireDAC.Comp.Client, Vcl.StdCtrls, Vcl.Grids, Vcl.DBGrids, FireDAC.Phys.ADS, FireDAC.Phys.ADSDef; type TForm1 = class(TForm) Button1: TButton; FDConnection1: TFDConnection; FDQuery1: TFDQuery; DBGrid1: TDBGrid; DataSource1: TDataSource; procedure Button1Click(Sender: TObject); private procedure FDQuery1AfterOpen(DataSet: TDataSet); { Private-Deklarationen } public { Public-Deklarationen } end; var Form1: TForm1; implementation {$R *.dfm} procedure TForm1.FDQuery1AfterOpen(DataSet: TDataSet); begin DataSource1.DataSet := FDQuery1; FDQuery1.ResourceOptions.CmdExecMode := amBlocking; end; procedure TForm1.Button1Click(Sender: TObject); begin if (FDQuery1.Command.State <> csInactive) then begin FDQuery1.Connection.AbortJob(true); FDQuery1.Connection.Close; end; DataSource1.DataSet := nil; if FDQuery1.Active then FDQuery1.Close; FDQuery1.SQL.Text := 'SELECT * FROM Kunden ORDER BY Nachname1, Vorname1, Gebdatum1'; FDQuery1.AfterOpen := FDQuery1AfterOpen; FDQuery1.ResourceOptions.CmdExecMode := amAsync; FDQuery1.Open; end; end.
Delphi-Quellcode:
object Form1: TForm1
Left = 0 Top = 0 Caption = 'Form1' ClientHeight = 336 ClientWidth = 635 Color = clBtnFace Font.Charset = DEFAULT_CHARSET Font.Color = clWindowText Font.Height = -11 Font.Name = 'Tahoma' Font.Style = [] OldCreateOrder = False PixelsPerInch = 96 TextHeight = 13 object Button1: TButton Left = 272 Top = 40 Width = 75 Height = 25 Caption = 'Button1' TabOrder = 0 OnClick = Button1Click end object DBGrid1: TDBGrid Left = 0 Top = 71 Width = 635 Height = 265 Align = alBottom DataSource = DataSource1 TabOrder = 1 TitleFont.Charset = DEFAULT_CHARSET TitleFont.Color = clWindowText TitleFont.Height = -11 TitleFont.Name = 'Tahoma' TitleFont.Style = [] end object FDConnection1: TFDConnection Params.Strings = ( 'Database=Demo' 'ServerTypes=Remote' 'User_Name=Demo' 'Password=Demo' 'DriverID=ADS') Left = 464 Top = 56 end object FDQuery1: TFDQuery Connection = FDConnection1 SQL.Strings = ( 'SELECT * FROM Kunden') Left = 456 Top = 128 end object DataSource1: TDataSource DataSet = FDQuery1 Left = 456 Top = 200 end end |
Alle Zeitangaben in WEZ +1. Es ist jetzt 06:22 Uhr. |
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