Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi Wie kann man eine SQL-Abfrage unterbrechen. (https://www.delphipraxis.net/181365-wie-kann-man-eine-sql-abfrage-unterbrechen.html)

Chemiker 9. Aug 2014 10:59

Datenbank: Firebird • Version: 2.1 • Zugriff über: Fibplus/IBDAC

Wie kann man eine SQL-Abfrage unterbrechen.
 
Hallo,

ich bin dabei ein kleines Programm zu schreiben das Datensätze aus einer Firebird – Datenbank in ein Excel – Tabelle überträgt. Ich habe vom Kunden eine aktuelles Backup bekommen und eingespielt, eine Tabelle davon enthält ca. 70 Mio. Datensätze.

Jetzt habe ich aber folgendes Problem, wenn ich jetzt eine Select – Abfragen zum Server schicke das die Abfrage zu lange dauert, oder sogar den Arbeitsspeicher zu klein wird und anschließend der Debugger von Delphi XE 6 sich auch gleich mit verabschiedet und ich Delphi über den Taskmanger abschließen muss, um es anschließend neu zu starten.

Ich würde jetzt gerne für die Tests einen Abbruch –Button für die Select – Abfrage einbauen, dass Problem ist aber das das Programm so beschäftigt ist, dass es keine Benutzer Eingabe mehr annimmt. Wie könnte man so etwas realisieren?

Bis bald Chemiker

himitsu 9. Aug 2014 11:05

AW: Wie kann man eine SQL-Abfrage unterbrechen.
 
Im PgDAC gibt es ein
Delphi-Quellcode:
Connection.BreakExec;
, um laufende Abfragen abzubrechen, eventuell haben das ja alle DACs.
Aber das mußt du natürlich aus einem anderem Thread aufrufen, denn in dem Wartenden kann man ja nix machen :stupid:, bzw. die abzubrechende Abfrage vorher in einen Thread auslagern, damit die GUI z.B. noch reagieren kann.
Oder man verbindet sich (eventuell mit einer anderen Connection) zur DB, wo man vermutlich irgendwie laufende SQLs abfragen und diese auch abschießen kann.
> Das war jetzt bezogen auf's Abbrechen von laufenden Open/Execute-Befehlen.

Die "WHILE NOT EOF DO ... NEXT"-Durchläuft bricht man z.B. mit einem Break ab, aber auch da entweder einen Thread oder ein Application.ProcessMessages, damit die GUI reagiert und man das abbrechen kann.

Bernhard Geyer 9. Aug 2014 11:09

AW: Wie kann man eine SQL-Abfrage unterbrechen.
 
Um das Speicherproblem zu lösen: Nimm einen Forward-Only Curser. D.h. jeder Datensatz den du schon mal angeschaut hast wird nach aufruf von .Next verworfen.
Alternativ .FetchAll = False setzen.

Um einen Abbruch zu ermöglichen wäre u.U. das BeforeFetch-Event geeignet.

Hansa 9. Aug 2014 11:21

AW: Wie kann man eine SQL-Abfrage unterbrechen.
 
Das ist echt interessante Frage. Wenn man sich das mal überlegt. :gruebel: 1. Die SQL-Abfrage ist an den Server übergeben. 2. Der arbeitet die ab. 3. der ist dumm. => Select aufsplitten. SELECT FIRST 100 FROM ??? Tja, das dann irgendwie mit ButtonClick einbauen. :P Soweit die 10 Cent von mir als erste Idee. :lol:

Dejan Vu 9. Aug 2014 12:23

AW: Wie kann man eine SQL-Abfrage unterbrechen.
 
Bei ADO gibt es die Möglichkeit, eine Abfrage asynchron abzuschicken. Dann kann man die auch abbrechen. Wenn etwas ähnliches mit der aktuellen Provider nicht geht, dann würde ich das auch happenweise verarbeiten. Vorteil: Du kannst eine Progressbar mit ETA (estimated time of arrival) einbauen, dann weiß man, wie lange es noch dauert.

hstreicher 9. Aug 2014 17:07

AW: Wie kann man eine SQL-Abfrage unterbrechen.
 
In Firebird 2.5 aufwärts kann mann das über die Monitoring Tables abschiessen

tsteinmaurer 9. Aug 2014 17:54

AW: Wie kann man eine SQL-Abfrage unterbrechen.
 
Einzelne Statements können über die MON$STATEMENTS Tabelle bereits mit Firebird 2.1 beendet werden. In Firebird 2.5 ist das Beenden einer ganzen Connection hinzugekommen.


Alle Zeitangaben in WEZ +1. Es ist jetzt 13:00 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