Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi -502: Declared cursor already exists (https://www.delphipraxis.net/86014-502-declared-cursor-already-exists.html)

Codehunter 7. Feb 2007 23:16

Datenbank: Firebird • Version: 1.5 • Zugriff über: ZEOS

-502: Declared cursor already exists
 
Ich bekomme neuerdings bei manchen Abfragen in nicht nachvollziehbarem Zyklus die Fehlermeldung "-502: Declared cursor already exists".

Ich habe eine permanent offene TZConnection und mehrere damit verbundene DataSets (TZQuery, TZTable usw.). Wenn ich ein neues Query absetze und ZEOS praktisch ein SELECT auf Firebird ausführt, erhalte ich manchmal diese Meldung.

Woher kommt das und wie stellt man das ab?

mkinzler 8. Feb 2007 07:46

Re: -502: Declared cursor already exists
 
Könnte daran liegen, das es pro Connection genau eine Transaktion gibt.

Codehunter 8. Feb 2007 12:17

Re: -502: Declared cursor already exists
 
Na sowas. Ich arbeite schon so lange mit ZEOS aber das Problem hatte ich bisher nicht. Kann man da irgendwas konfigurieren oder muß ich für jede ZTable, ZQuery usw. eine eigene ZConnection instantiieren und kann man überhaupt mehrere ZConnections gleichzeitig mit dem Embedded Server verbinden?

mkinzler 8. Feb 2007 12:34

Re: -502: Declared cursor already exists
 
Zitat:

kann man überhaupt mehrere ZConnections gleichzeitig mit dem Embedded Server verbinden?
Nein.

Codehunter 8. Feb 2007 15:37

Re: -502: Declared cursor already exists
 
Ist ja prickelnd. Und nun?

mkinzler 8. Feb 2007 15:41

Re: -502: Declared cursor already exists
 
Am besten ne andere Zugriffsbibliothek verwenden.

Codehunter 8. Feb 2007 17:12

Re: -502: Declared cursor already exists
 
Keine Chance, dafür ist das Projekt schon zu weit fortgeschritten. Außerdem denke ich liegt das Problem in meinem Code (denn früher gabs besagte Fehlermeldung nicht obwohl es die ganze Zeit mehrere Queries an einer Connection gab). Mehrere parallele Abfragen sollten doch für einen SQL-Server kein Problem sein.

hoika 8. Feb 2007 17:15

Re: -502: Declared cursor already exists
 
Hallo,

packe deine Queries in ZConnection.StartTransaction / Commit,
so dass sie immer unter einer einzigen Transaktion laufen.

Hast du multithreading oder mdi ?

Dann bleibt dir nur der Weg über mehrere ZConnections.
Zeos war als Ersatz der Bde gedacht (afaik)
Mehr als ein Transaktion pro Connection geht nicht.


#Edit:# es sieht so aus (google), als ob das ein Bug ein Zeos ist


Heiko

Codehunter 8. Feb 2007 17:26

Re: -502: Declared cursor already exists
 
Nein ich habe nur eine Single-Threading-Anwendung (von den Indy-Threads mal abgesehen). Ich hatte auch nach dem Problem gegoogled aber nur spanische und polnische Forenposts gefunden.

Das mit den ZTransaktions, kannst du mir das mal genauer erklären bzw. gibts im Web ne gute Erklärung?

hoika 8. Feb 2007 17:31

Re: -502: Declared cursor already exists
 
Hallo,

mein Fehler,
bei ZEOS ist es ja wie bei der Bde,
die Transaktion und die ZConnection sind gekoppelt:

Delphi-Quellcode:
ZConnection.StartTransaktion;
try
  Query_1.bla
  Query_2.bla
finally
  ZConnection.Commit;
end;
Heiko

Codehunter 8. Feb 2007 17:46

Re: -502: Declared cursor already exists
 
Ich denke so langsam kapiere ich das Problem. Ich habe da ein datensensitives DBGrid in dessen OnChange-Event erzeuge ich ein zusätzliches Query auf der selben Connection, der selben TZQuery und der selben Tabelle. Wahrscheinlich passieren die internen Transaktionen vom Grid und die im OnChange-Event so schnell nacheinander daß der Laden gelegentlich durcheinander kommt. Einfach ein Leichtsinnsfehler. Ich werds jetzt mal umstricken und hoffe daß das Problem dann aus der Welt ist.

Codehunter 8. Feb 2007 20:44

Re: -502: Declared cursor already exists
 
Problem gelöst!

Ich habe noch etwas gesucht und ein ähnliches Problem in einer Newsgroup gefunden:

http://www2.usenetarchive.org/Dir36/File660.html

Dort handelte es sich zwar um Interbase+IBX aber das Workaround war sehr interessant: Einfach vor dem Query ein Randomize absetzen. Ich habs probiert und das Problem war vom Tisch. Scheinbar ist das ein uralter Bug den Firebird schon aus IB-Zeiten mit sich rumschleppt bzw. bei FB der selbe Fehler gemacht wurde. Sonst würde der Workaround nicht bei beiden funktionieren.

Aber auf so eine Lösung muß man erstmal kommen ;)


Alle Zeitangaben in WEZ +1. Es ist jetzt 21:13 Uhr.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz