Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi Query abbrechen (https://www.delphipraxis.net/14337-query-abbrechen.html)

Jacki O 7. Jan 2004 10:10


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

Hansa 7. Jan 2004 10:19

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)

Garby 7. Jan 2004 10:54

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.

Jacki O 7. Jan 2004 18:40

Re: Query abbrechen
 
Hallo,

Zitat:

um ein SQL-Statement zu Stoppen musst du erstmal die Query in einem eigenen Thread starten
Genau das tue ich. Ich habe follgendes SQL-Statement:
SQL-Code:
select * from MyTable t1
   where t1."date" >= '2004/01/07 00:00:00'
   and  t1."date" < '2004/01/07 01:00:00'
Die Query ist wie gesagt in einem eigenen Thread, damit das Programm bedienbar bleibt.
Ausgeführt wird durch :
Delphi-Quellcode:
Query.Open;
Wenn der User sich nun geirrt hat und Abbrechen will, muß er z.Zt. so lange warten, bis die
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

Robert_G 7. Jan 2004 21:34

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 Luckies Thread-Tut empfehlen.

Jacki O 7. Jan 2004 22:04

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

Robert_G 7. Jan 2004 22:26

Re: Query abbrechen
 
Also ich verwende für DB-Zugriffe Direct Oracle Access.
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]

Leuselator 7. Jan 2004 23:09

Re: Query abbrechen
 
Hatten wir schonmal, hier zu finden.
Im Anhang dort findest Du einen Ansatz...
Gruß

choose 8. Jan 2004 10:03

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:
myThread.WaitFor;
// Query is ready
DoSthWithResult(myThread);
myThread.FreeOnReady:= True; // implicit call of myThread.Free
// always set freed reference to nil ;)
myThread:= nil;
Auf diese Weise könntest Du im Fall eines Abbruchs, den laufen Thread einfach "vergessen" und sofort einen neuen starten:
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 02:59 Uhr.

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