AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Datenbanken Delphi Wie kann man eine SQL-Abfrage unterbrechen.
Thema durchsuchen
Ansicht
Themen-Optionen

Wie kann man eine SQL-Abfrage unterbrechen.

Ein Thema von Chemiker · begonnen am 9. Aug 2014 · letzter Beitrag vom 9. Aug 2014
Antwort Antwort
Benutzerbild von Chemiker
Chemiker

Registriert seit: 14. Aug 2005
1.859 Beiträge
 
Delphi 11 Alexandria
 
#1

Wie kann man eine SQL-Abfrage unterbrechen.

  Alt 9. Aug 2014, 11:59
Datenbank: Firebird • Version: 2.1 • Zugriff über: Fibplus/IBDAC
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
wer gesund ist hat 1000 wünsche wer krank ist nur einen.
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.063 Beiträge
 
Delphi 12 Athens
 
#2

AW: Wie kann man eine SQL-Abfrage unterbrechen.

  Alt 9. Aug 2014, 12:05
Im PgDAC gibt es ein 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 , 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.
Neuste Erkenntnis:
Seit Pos einen dritten Parameter hat,
wird PoSex im Delphi viel seltener praktiziert.

Geändert von himitsu ( 9. Aug 2014 um 12:40 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Bernhard Geyer
Bernhard Geyer

Registriert seit: 13. Aug 2002
17.196 Beiträge
 
Delphi 10.4 Sydney
 
#3

AW: Wie kann man eine SQL-Abfrage unterbrechen.

  Alt 9. Aug 2014, 12:09
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.
Windows Vista - Eine neue Erfahrung in Fehlern.
  Mit Zitat antworten Zitat
Hansa

Registriert seit: 9. Jun 2002
Ort: Saarland
7.554 Beiträge
 
Delphi 8 Professional
 
#4

AW: Wie kann man eine SQL-Abfrage unterbrechen.

  Alt 9. Aug 2014, 12:21
Das ist echt interessante Frage. Wenn man sich das mal überlegt. 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. Soweit die 10 Cent von mir als erste Idee.
Gruß
Hansa
  Mit Zitat antworten Zitat
Dejan Vu
(Gast)

n/a Beiträge
 
#5

AW: Wie kann man eine SQL-Abfrage unterbrechen.

  Alt 9. Aug 2014, 13:23
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.
  Mit Zitat antworten Zitat
hstreicher

Registriert seit: 21. Nov 2009
220 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#6

AW: Wie kann man eine SQL-Abfrage unterbrechen.

  Alt 9. Aug 2014, 18:07
In Firebird 2.5 aufwärts kann mann das über die Monitoring Tables abschiessen
  Mit Zitat antworten Zitat
tsteinmaurer

Registriert seit: 8. Sep 2008
Ort: Linz, Österreich
530 Beiträge
 
#7

AW: Wie kann man eine SQL-Abfrage unterbrechen.

  Alt 9. Aug 2014, 18:54
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.
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 18:52 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