Zum Inhalt springen

Empfohlene Beiträge

Geschrieben

Guten Morgen,

ich habe mal wieder ein Problem bei dem ich einfach nicht weiterkomme.

Und zwar geht es um den Zugriff auf eine Oracle-DB mit DOA.

Ich habe ein Programm geschrieben welches dem Benutzer erlaubt eingaben zu machen welche zu einem SQL-Befehl zusammengesetzt werden.

Da die User auch mal was eingeben was in der Datenbank nicht existieren - Tippfehler, Absicht ... - dann läuft die Abfrage auf Daten eine ganze Weile.

Sollte der User nun seinen Fehler feststellen sollte er abbrechen können, was man mit OracleSession1.BreakExecution auch tun kann.

Führt der Anwender die Abfrage erneut aus so erhält er folgende Fehlermeldung:

Query thread still in progress.

Danach geht nichts mehr.

Ich möchte gerne das der User dann weiterhin arbeiten kann.

Ich Verwende die DOA-Komponente mit der Eigenschaft: Threaded := True;

Hoffe ich konnte euch verdeutlichen wo mein Problem liegt.

Danke schonmal für eure Tipps und Ratschläge.

Geschrieben
Guten Morgen,

hat keiner einen Tipp?

Ist das Problem für euch unverständlich erklärt?

Gibt es keine Möglichkeit?

Vermutlich kennt sich hier keiner mit DOA aus (ich ja auch nicht).

Erklärung ist ansonsten verständlich.

P.S.: Ich hab deinen "DAO" Vertipper im Text korrigiert. ;)

Geschrieben

Hallo,

die kommt von der Oracle-Komponente da diese die Threads verwaltet.

Ich glaub ich bin aber dem Fehler auf die schliche gekommen:

ich habe, um die DOA Komponente besser testen zu können, ein kleines Programm geschrieben, welches eine SQL-Abfrage ausführt.

um einen TProgressBar zu verwirklichen starte ich zwei abfragen eine mit count(*), für ProgressBar1.Max, und eine eben mit den entsprechenden Spalten, für das TStringGrid.

wenn ich so eine abfrage im Threaded := True Modus starte dann kann ich die einzelnen Vorgänge selber mit aufgaben belegen.

OracleQuery1.OnThreadExecuted

OracleQuery1.OnThreadRecord

OracleQuery1.OnThreadFinished

OracleQuery1.OnThreadError

wenn ich den Vorgang in OnThreadExecuted abbrechen will muss ich mit Session.BreakExecution arbeiten. möchte ich den Vorgang in OnThreadRecord abbrechen muss ich dies mit BreakThread tun. Beide geben den ora-01013 zurück - userbedingter Abbruch.

Laufen zwei OracleQuery im Threaded Modus dann funktioniert der befehl oraclesession1.breakexecution bzw. oraclequery1.breakthread nicht richtig.

Deshalb kommt beim nächsten mal auch die Meldung das der Thread noch arbeitet - "Querythread still in progess".

verwende ich nur eine TOracleSession/Query dann funktioniert das einwandfrei und ich kann mehrere male den Vorgang in OnThreadExecuted abbrechen, leider hab ich in diesem Fall keine TProgressBar.

evlt. mach ich ja was beim abbrechen falsch.

Der abbrechen Button mach eigentlich nichts anderes als

/* 1 */ OracleSession1.BreakExecution;

/* 2 */ OracleQuery1.BreakThread;

1, sollte der Vorgang noch in OnThreadExecute sein dann wird dieser beendet.

2. sollte der Vorgang schon in OnThreadRecord sein dann wird dieser beendet.

Dies ist für meinen fall eben zweimal. für oraclesession1 und oraclesession2 und oraclequery1 und oraclequery2, dann wird aber aus irgendeinem Grund nicht ordentlich beendet und der thread läuft weiter.

versuche jetzt die thread nacheinander zu starten. sprich wenn oraclequery1.onthreadfinish erreicht ist soll dieser den oraclequery2 anstarten.

somit hätte ich dann auch noch die TProgressBar.

Hoffe dass ich alles verständlich ausgedrückt habe.

Sollte jemand einen anderen Vorschlag haben oder ich mit meinen Ausführungen falsch liegen dann nur her damit.

@grueni: Danke :)

Geschrieben

Hallo,

es funktioniert alles reibungslos wenn man die Threads nacheinander laufen lässt. Spricht errreicht ein OracleQuery.OnThreadFinish dann kann man von dort aus den nächsten OracleQuery starten.

So ist es möglich die evtl. langen Wartenzeiten während des OnThreadExecute bzw. OnThreadRecord mit OracleSession.BreakExecution bzw. OracleQuery.BreakThread beendet werden.

Danach läuft das Programm einwandfrei weiter.

  • 2 Wochen später...
Geschrieben

Hallo,

das ist keine Blöde sonder eine berechtigte Frage.

Da meine Anwendung pro PC einmal läuft, sprich ein Anwender hat einen Anwendung meines Typs. Sollte dieser eine zweite Anwendung meines Typs öffnen dann bauen sich zwei neue Verbindunge zu Datenbank auf.

Dies geschieht auch wenn ein andere User im Netz die Anwendung startet.

Am besten sieht man es im PL/SQL-Developer da gibt es in einem Menü den Punkt Sessions. Da sieht man dann wer von wo eine Verbindung zu Datenbank aufbaut.

Zusammengefasst: Jeder User/Anwender der Anwendung sieht die Daten die er angefragt hat.

Hoffe konnte meinen Gedanken geordnet und verständlich niederschreiben.

Dein Kommentar

Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung wiederherstellen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...