AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Datenbanken Delphi SQL-Select während der Ausführung wieder abbrechen
Thema durchsuchen
Ansicht
Themen-Optionen

SQL-Select während der Ausführung wieder abbrechen

Offene Frage von "daddy"
Ein Thema von daddy · begonnen am 12. Feb 2010 · letzter Beitrag vom 13. Feb 2010
Antwort Antwort
Seite 1 von 2  1 2      
daddy

Registriert seit: 9. Sep 2005
Ort: Köln
126 Beiträge
 
Delphi 7 Enterprise
 
#1

SQL-Select während der Ausführung wieder abbrechen

  Alt 12. Feb 2010, 15:46
Datenbank: Firebird • Version: 1.5 • Zugriff über: IBExpress
Ich arbeite mit Firebird und IBExpress und möchte dem Anwender die Möglichkeit bieten, einen langwierigen Select-Befehl wieder abzubrechen. Hier ergeben sich nun zwei Probleme, nachdem ich das ClientDataSet.Open aufgerufen habe.

1. Ich muss ein geeignetes Ereignis (z.b. Tastendruck oder Mausklick) abfangen, obwohl das Programm das OPEN ausführt.
2. Ich muss dann das OPEN von außen stoppen können.

Ich habe einen Ansatz über Threads versucht, habe aber mit der Thread-Programmierung wenig Erfahrung. Das Abfangen des Ereignisses funktioniert problemlos. Mit TerminateThread kann ich auch den Thread, der das OPEN ausführt radikal beenden. Ich frage mich aber, ob dieser radikale Abbruch überhaupt sinnvoll und zulässig ist. Meistens scheint es zwar zu funktionieren, manchmal habe ich aber hinterher Probleme bei Programmende, so als wären irgendwelche Speicherbereiche nicht korrekt freigegeben worden. Das Programm hängt sich dann ohne Fehlermeldung auf.

Meine Fragen:
1. Ist der Ansatz überhaupt der richtige? Welche Alternativen sind möglich?
2. Gibt es irgendwelche Randbedingungen, die beim TerminateThread zu beachten sind?
3. Kennt jemand zu diesem Problem bereits einen anderen Beitrag in der Delphi Praxis oder irgend ein geeignetes sonstiges Dokument?

Dank für jede Hilfe!

Daddy
  Mit Zitat antworten Zitat
hoika

Registriert seit: 5. Jul 2006
Ort: Magdeburg
8.275 Beiträge
 
Delphi 10.4 Sydney
 
#2

Re: SQL-Select während der Ausführung wieder abbrechen

  Alt 12. Feb 2010, 15:58
Hallo,

ab FB2 (oder 2.1 ?) kann eine Transaktion unterbrochen werden (Release Notes).
Bei IBX geht das aber trotzdem nicht.

Das mit den Threads geht auch,
1

Es sollte mindestens eine eigene Transaktions-Komponente benutzt werden.


Heiko
Heiko
  Mit Zitat antworten Zitat
Benutzerbild von haentschman
haentschman

Registriert seit: 24. Okt 2006
Ort: Seifhennersdorf / Sachsen
5.387 Beiträge
 
Delphi 12 Athens
 
#3

Re: SQL-Select während der Ausführung wieder abbrechen

  Alt 12. Feb 2010, 17:05
Hallo...

Zitat:
Ich arbeite mit Firebird und IBExpress und möchte dem Anwender die Möglichkeit bieten, einen langwierigen Select-Befehl wieder abzubrechen.
verstehe ich nicht wirklich wie "langwierig" das SQL sein soll
Ich verwende teilweise komplexe SQL´s. Der Nutzer hätte gar keine Chance den Vorgang zu "unterbrechen", da die Daten ruck-zuck im Dataset sind.

Was hälst du denn vom Verwerfen des Datasets wenn der Nutzer das Ergebnis nicht sehen will ?

Nachtrag: Kann der User das SQL selbst eingeben ? Wenn ja, dann ist mir klar was du meinst...
  Mit Zitat antworten Zitat
daddy

Registriert seit: 9. Sep 2005
Ort: Köln
126 Beiträge
 
Delphi 7 Enterprise
 
#4

Re: SQL-Select während der Ausführung wieder abbrechen

  Alt 12. Feb 2010, 17:54
@haentschman

Zitat:
verstehe ich nicht wirklich wie "langwierig" das SQL sein soll Grübelnd...
Ich verwende teilweise komplexe SQL´s. Der Nutzer hätte gar keine Chance den Vorgang zu "unterbrechen", da die Daten ruck-zuck im Dataset sind.
Im Prinzip ist Firebird in der Tat extrem schnell. Aber, wenn ich z.B. eine Inventurliste mit sagen wir mal 400 Seiten drucke, kann das eben doch eine (kurze) Weile dauern, bis die Daten verfügbar sind. Erst recht, wenn die Abfrage online über eine VPN-Anbindung erfolgt. Und wenn der Anwender dann merkt, dass er die Liste vielleicht doch grad gar nicht haben möchte, sollte es möglich sein, dieses auch während der Ausführung des Selects schon zu unterbrechen.

Zitat:
Was hälst du denn vom Verwerfen des Datasets wenn der Nutzer das Ergebnis nicht sehen will ?
Meinst Du das Select im Hintergrund weiterlaufen zu lassen und anschließend damit nichts zu machen? Wär natürlich im Prinzip möglich, würde aber den Server unnötig belasten und unnötigen Datentraffic zum Client bedeuten! Also keine optimale Lösung.
  Mit Zitat antworten Zitat
hoika

Registriert seit: 5. Jul 2006
Ort: Magdeburg
8.275 Beiträge
 
Delphi 10.4 Sydney
 
#5

Re: SQL-Select während der Ausführung wieder abbrechen

  Alt 12. Feb 2010, 18:08
Hallo,

Zitat:
Und wenn der Anwender dann merkt, dass er die Liste vielleicht doch grad gar nicht haben möchte
Hm, ist hier das "Rüberziehen" der Daten vom Server nicht der Flaschenhals ?

D.h., innerhalb der

Delphi-Quellcode:
while not Query.Eof do
begin

 // hier unterbrechen

  Query.Next;
end;

Heiko
Heiko
  Mit Zitat antworten Zitat
daddy

Registriert seit: 9. Sep 2005
Ort: Köln
126 Beiträge
 
Delphi 7 Enterprise
 
#6

Re: SQL-Select während der Ausführung wieder abbrechen

  Alt 12. Feb 2010, 18:27
Zitat:
Hm, ist hier das "Rüberziehen" der Daten vom Server nicht der Flaschenhals ?
Nein, da so eine Schleife in meinem Programm nicht existiert. Ich rufe ja nur - wie in #1 erwähnt - ClientDataSet.Open auf. Danach wird die Datenmenge von Rave weiter verwendet. Bei der Erzeugung des Rave Reports ist eine Unterbrechung möglich, beim OPEN aber noch nicht zuverlässig. Ich werde jetzt mal prüfen, ob eine explizite Transaktion irgendetwas ändert. Bin aber weiter für Hinweise dankbar.

Gruß

Daddy
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

Registriert seit: 9. Dez 2005
Ort: Heilbronn
39.858 Beiträge
 
Delphi 11 Alexandria
 
#7

Re: SQL-Select während der Ausführung wieder abbrechen

  Alt 12. Feb 2010, 19:13
Zitat:
Zitat:
Hm, ist hier das "Rüberziehen" der Daten vom Server nicht der Flaschenhals ?


Nein, da so eine Schleife in meinem Programm nicht existiert. Ich rufe ja nur - wie in #1 erwähnt - ClientDataSet.Open auf.
Und die daten werden dann zum Client gebeamt?
Markus Kinzler
  Mit Zitat antworten Zitat
daddy

Registriert seit: 9. Sep 2005
Ort: Köln
126 Beiträge
 
Delphi 7 Enterprise
 
#8

Re: SQL-Select während der Ausführung wieder abbrechen

  Alt 12. Feb 2010, 19:45
Zitat:
Und die daten werden dann zum Client gebeamt?
Wohl kaum, aber alles weitere geschieht dann im Rave.

Die Diskussion führt inzwischen in eine völlig falsche Richtung. Ich möchte einfach nur nach dem OPEN noch Zugriff von außen haben. Warum das OPEN nun langwierig ist oder nicht ist in diesem Zusammenhang ja eigentlich völlig unerheblich.
  Mit Zitat antworten Zitat
Benutzerbild von haentschman
haentschman

Registriert seit: 24. Okt 2006
Ort: Seifhennersdorf / Sachsen
5.387 Beiträge
 
Delphi 12 Athens
 
#9

Re: SQL-Select während der Ausführung wieder abbrechen

  Alt 12. Feb 2010, 20:09
hmmm...

mir fallen da eigentlich nur 2 Varianten ein:

1. das Open in einem Thread ablaufen lassen und ggf. abschießen (wie schon erwähnt)
2. während der Server die Daten "zusammensucht" kannst du eh nicht eingreifen. Vieleicht gibt es eine Möglichkeit am Dataset anzusetzen wenn die Daten eintrudeln. Mit jedem DS wird doch "OnSroll" aufgerufen. Was würde passieren, wenn man das Dataset einfach mittendrin freigibt ?
3. ein Tool programmieren was auf dem Server läuft, das den Report zusammenstellt und dann z.B. als File zur Verfügung stellt.

...alles in allem wird das nur über "schmutzige" Tricks funktionieren.

  Mit Zitat antworten Zitat
daddy

Registriert seit: 9. Sep 2005
Ort: Köln
126 Beiträge
 
Delphi 7 Enterprise
 
#10

Re: SQL-Select während der Ausführung wieder abbrechen

  Alt 12. Feb 2010, 20:56
Also nach Euren Kommentaren habe ich mir das noch einmal genauer angesehen. Wie gesagt, ich rufe an der Stelle, um die es mir geht, einfach nur ClientDataSet.Open auf. Aber im Hintergrund passiert natürlich mehr. Das ClientDataSet ist mit einem DataSetProvider verknüpft, der sich die Daten über ein SQLDataSet holt. Das SQLDataSet greift auf den Firbird Server zu. Nach dem OPEN des ClientDataSet wird nun tatsächlich relativ schnell (und immer wieder) das OnAfterScroll des SQLDataSet durchlaufen, nämlich während die Daten in das ClientDataSet geschoben werden. Insofern könnte ich auch an dieser Stelle eingreifen und müsste dem ClientDataSet oder dem Provider mitteilen, dass keine weiteren Daten notwendig sind. Gibt es hierfür einen Aufruf?
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


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 04:48 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