Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Datenbankabfrage abbrechen (https://www.delphipraxis.net/70051-datenbankabfrage-abbrechen.html)

Maa83 24. Mai 2006 10:19


Datenbankabfrage abbrechen
 
Hallo,

ich möchte eine Datenbanksuche starten. Das Ganze mache ich mit einer TADOQuery.
Ich sage also ado_tmp.Open; Er fängt an zu suchen und sucht und sucht und sucht.
Irgendwann wird mir das zu blöd weil es zu lange dauert und ich möchte die Suche abbrechen.
Wie kann ich das machen? Thread-Programmierung?

Ich hoffe ihr könnt mir ein paar Tipps geben.

Gruß
Martin

s-off 24. Mai 2006 10:28

Re: Datenbankabfrage abbrechen
 
Hallo,

kann es gerade nicht testen, aber hast Du es mal mit der Cancel-Methode probiert?

Maa83 24. Mai 2006 10:36

Re: Datenbankabfrage abbrechen
 
Das Problem ist das ich während des .Open; nicht auf einen Button oder ähnliches Zugreifen kann. Somit kann ich auch keine Prozedur aufrufen die das .Cancel enthält.

TBx 24. Mai 2006 10:55

Re: Datenbankabfrage abbrechen
 
Hallo!

Unterbrechen kannst Du nach jedem gefundenen Datensatz im OnFetchProgress-Event der ADO-Query.

Wenn DU schon vor Erscheinen des ersten Ergebnissatzes lange warten mußt, so solltest Du Deine Abfrage bzw. Daein Datenbankdesign überdenken.
Evtl. fehlen Dir dann nur ein paar Indizes.
Poste doch mal ein Beispiel.

Gruß

onlinekater

s-off 24. Mai 2006 10:56

Re: Datenbankabfrage abbrechen
 
Schau Dir mal die Open-Methode vom TAdoQuery an - vielleicht kannst Du da an geeigneter Stelle ein Application.ProcessMessages einbauen. Wenn ich mich nicht irre, hat das ein Kollege von mir schonmal für ein TADSQuery gemacht.

Maa83 24. Mai 2006 12:52

Re: Datenbankabfrage abbrechen
 
also, ich hab jetzt folgende Dinge entdeckt und dabei leider nichts ergiebiges herausgefunden:

Es gibt bei der ADOQuery die Eigenschaft ExecuteOptions. Diese kann ich auf "eoAsyncExecute" stellen. Das hat zur Folge das ich während des Öffnens der Query andere Dinge tun kann --> also genau das was ich möchte. Aber das NOCDBGrid zeigt dann nur einen Datensatz an obwohl das Grid noch viel Platz hätte. Ich kann dann auch einzeln durch die Datensätze durchgehen. Ich bräuchte hier die Möglichkeit das das Grid wieder alle Datensätze ganz normal anzeigt. Die Ereignisse "OnFetchComplete" und "OnFetchProgress" werden nicht aufgerufen.

Als zweites hab ich die Eigenschaft ExecuteOptions auf "eoAsyncFetch" gestellt. Das hat zur Folge das ich keine Möglichkeit habe während der Verarbeitung zu agieren. Das Ereigniss "OnFetchProgress" wird nur ein einziges Mal und zwar ganz am Schluß aufgerufen, gefolgt von "OnFetchComplete". Würde das Ereigniss "OnFetchProgress" öfter auftreten, so wie in der Hilfe beschrieben wär mein Problem auch gelöst.

In die AdoQuery selber möchte ich eigentlich nicht eingreifen da es sich hier um ein sehr großes Produkt handelt. Wenn ich die AdoQuery ändern würde, würde sich das durch das ganze Programm ziehen.

Bitte helft mir :gruebel:

Gruß
Martin

webcss 24. Mai 2006 13:36

Re: Datenbankabfrage abbrechen
 
Ich schätze, Dein erster Gedanke war nicht schlecht: Thread-Programmierung. So kannst Du den Thread mit der Abfrage über einen zweiten Thread "killen". Das Problem ist nur folgendes: Sobald Du TADOQuery.Select mit Open abgesetzt hast, musst Du irgendeinen Zugang zum Server finden, denn dort wird Dein Statement abgearbeitet.
Der von Dir eingesetzte Server sollte also irgenwie von sich aus eine Möglichkeit bieten eine Select-Abfrage abzubrechen, ansonsten sieht's düster aus.

Wenn Du mit einer lokalen DB arbeitest, könntest könntest Du einfach den Lokalen Abfrage-Thread "killen", notfalls über einen eigenen Button ausgelöst.


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