![]() |
Query abbrechen
Hallo,
ich habe follgendes Problem: Ich lasse eine Query ein SQL-Statemant ausführen, dies dauert seine Zeit. Nun möchte ich diese Ausführung abbrechen. Aber wie ? Einfach nur close hat nicht hin. Gruß Jacki |
Re: Query abbrechen
Das könnte ein Hinweis darauf sein, daß die Query falsch aufgebaut ist. Wenn etwas abgebrochen werden soll, so braucht man meist nicht erst damit anzufangen. 8)
|
Re: Query abbrechen
Hallo,
um ein SQL-Statement zu Stoppen musst du erstmal die Query in einem eigenen Thread starten, was aber wieder andere Probleme mit sich bringen wird. |
Re: Query abbrechen
Hallo,
Zitat:
SQL-Code:
Die Query ist wie gesagt in einem eigenen Thread, damit das Programm bedienbar bleibt.
select * from MyTable t1
where t1."date" >= '2004/01/07 00:00:00' and t1."date" < '2004/01/07 01:00:00' Ausgeführt wird durch :
Delphi-Quellcode:
Wenn der User sich nun geirrt hat und Abbrechen will, muß er z.Zt. so lange warten, bis die
Query.Open;
Ergebnissmenge vorliegt. Bei 400.000 Datensätzen dauert das ein wenig länger. Ich arbeite mit einer TQuery-, einer TSession- und TDatabase-Komponente. Gruß Jacki |
Re: Query abbrechen
Mit Query.Open wird kein extra Thread gestartet.
Deine Anwendung macht natürlich garnix während die Abfrage läuft. Wenn du dich mit Threads auseinandersetzen willst, kann ich dir nur ![]() |
Re: Query abbrechen
Hi,
in einem Thread wird die Query mit Create erzeugt, genau wie die anderen Datenbank - Komponenten auch. In der Execute Methode des Threads wird das SQL Statement geladen und ausgeführt, damit die Anwendung weiter bedienbar bleibt. Ich hatte gehofft, das man so etws wie ein disconnect machen köntte. Sorry, wenn ich mich missverständlich ausgedrückt hatte. Gruß Jacki |
Re: Query abbrechen
Also ich verwende für DB-Zugriffe
![]() Bei diesem Package besitzt die TOracleQuery-Kompo die Möglichkeit, die Abfrage in einem seperatem Thread ablaufen zu lassen. Wenn du auch dieses Package nutzt, dann kannst mit Query.BreakThread den Thread beenden. Mit den Standardkomponenten von Delphi ist das nicht möglich (kein integrierter Thread), da deine Anwendung ja nur einen Programmablauf hat. [Edit] Habe ich dich jetzt richtig verstanden, dass du einen Thread anlegst in dem deine Query ausgeführt wird. [/Edit] |
Re: Query abbrechen
|
Re: Query abbrechen
Könntest Du nicht den Thread mit einer Eigenschaft FreeOnReady ertstellen, so dass der Thread freigegeben wird, wenn er sich beendet (Execute ist durchlaufen), was exakt dem Verhalten von FreeOnTerminate entspricht, darüber hinaus aber den Thread auch sofort freigibt, falls er bereits durchlaufen ist?
Also etwas der Art
Delphi-Quellcode:
Auf diese Weise könntest Du im Fall eines Abbruchs, den laufen Thread einfach "vergessen" und sofort einen neuen starten:
myThread.WaitFor;
// Query is ready DoSthWithResult(myThread); myThread.FreeOnReady:= True; // implicit call of myThread.Free // always set freed reference to nil ;) myThread:= nil;
Delphi-Quellcode:
// "forget" or free current query
myQueryThread.FreeOnReady; // create new query thread myQueryThread:= TQueryThread.Create(AQueryString); |
Alle Zeitangaben in WEZ +1. Es ist jetzt 20:47 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