Maulwurf_der_Schlaue Geschrieben 23. August 2006 Geschrieben 23. August 2006 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. Zitieren
Maulwurf_der_Schlaue Geschrieben 28. August 2006 Autor Geschrieben 28. August 2006 Guten Morgen, hat keiner einen Tipp? Ist das Problem für euch unverständlich erklärt? Gibt es keine Möglichkeit? Zitieren
grueni Geschrieben 28. August 2006 Geschrieben 28. August 2006 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. Zitieren
Amstelchen Geschrieben 28. August 2006 Geschrieben 28. August 2006 @maulwurf: "Query thread still in progress" wird die meldung von seiten DOA geworfen, oder kommt die von oracle? s'Amstel Zitieren
Maulwurf_der_Schlaue Geschrieben 30. August 2006 Autor Geschrieben 30. August 2006 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 Zitieren
Maulwurf_der_Schlaue Geschrieben 30. August 2006 Autor Geschrieben 30. August 2006 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. Zitieren
isardor Geschrieben 11. September 2006 Geschrieben 11. September 2006 Klingt jetzt vielleicht etwas dumm, aber was passiert dann wenn zwei Leute gleichzeitig damit arbeiten? Zitieren
Maulwurf_der_Schlaue Geschrieben 12. September 2006 Autor Geschrieben 12. September 2006 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. Zitieren
Empfohlene Beiträge
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.