Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   SQL - Invalid cursor declaration (https://www.delphipraxis.net/199596-sql-invalid-cursor-declaration.html)

stalkingwolf 5. Feb 2019 07:33

Datenbank: Firebird • Version: 2.5 • Zugriff über: TIBQuery

SQL - Invalid cursor declaration
 
Liste der Anhänge anzeigen (Anzahl: 1)
der angehängte Fehler bringt mich noch um den Verstand.

Es handelt sich dabei um ein Delphi XE4 Programm und ab und zu ( nicht immer und nicht reproduzierbar ) tritt dieser Fehler auf.
Ich hab das Programm mit Debugs, Protokollen und Exceptions zugepflastert, aber ich kann nicht ermitteln bei was der Fehler auftritt.

Vor allem schaut das nach einem Speicherproblem aus. Der Müll am Ende des Cursornamens weist darauf hin.

Wir hatten das Problem damals schon in einer etwas anderen Form unter Delphi 6 Programmen.
Damals haben wir TIBQuery&Co geändert und den Namen des Cursors selber vergeben. Damit war das Problem aus der Welt.
Die Namen waren damals Random und mit einer sehr kurzen Nummer vergeben, diesen hatten wir verlängert.
Nachdem wir die Programm auf XE4 portiert haben, tritt das Problem erneut auf. Und diesmal können wir TIBQuery&Co nicht einfach ändern, weil Delphi dann beim kompilieren anmerkt das verschiedene DCUs mit unterschiedlichen Datum kompiliert sind.

Ich würde gern den Fehler verstehen, damit ich weiß wobei so etwas auftreten könnte.

dataspider 5. Feb 2019 07:52

AW: SQL - Invalid cursor declaration
 
So wie es aussieht, haben die IBX einen Fehler:
http://tracker.firebirdsql.org/browse/CORE-4559.

Keine leichte Aufgabe...

Frank

hoika 5. Feb 2019 08:17

AW: SQL - Invalid cursor declaration
 
Hallo,
Zitat:

Keine leichte Aufgabe...
Wieso, die Lösung (IBX patchen) steht doch dort?
Ist nur sehr mühsam, das bei jeder Methode (Insert/Update/Delete) zu machen.

Wir hatten uns damals eine eigene TMyQuery abgeleitet und die entsprechenden Methoden überscheiben.
Und nein, die hieß nicht wirklich TMyQuery.

Der Rest ist dann Suchen/Ersetzen.

stalkingwolf 7. Feb 2019 07:35

AW: SQL - Invalid cursor declaration
 
Moin,

danke für die Info.
Google wollte/will mir die Seite bei der Suche irgendwie nicht ausspucken.

dann schau ich mir das mal genauer an.

Gruß
Sven

stalkingwolf 7. Feb 2019 09:40

AW: SQL - Invalid cursor declaration
 
Ich hoffe ich versteh das korrekt.

Wenn ich TIBSQL nutzen, dann füge ich den Code ein und nutze dann TMyIBSQL anstatt TIBSQL in meiner unit.
Da der FCursor Name im .create von TIBSQL generiert wird, sollte es reichen nach dem .create PatchIBSQLCursor aufzurufen.

also
Code:
q := TMyIBSQL.Create(nil);
q.database := dm.ibdb;
q.PatchIBSQLCursor(q);
.
.
.
Ausgabe in PatchIBSQLCursor vom Cursornamen schaut gut aus.

Korrekt verstanden?

Union 7. Feb 2019 10:02

AW: SQL - Invalid cursor declaration
 
In neueren Versionen (hier 10.2.3) wird der Cursorname überhaupt nicht mehr gesetzt, dort entfällt das Problem, da isc_dsql_set_cursor_name nicht aufgerufen wird.

hoika 7. Feb 2019 10:17

AW: SQL - Invalid cursor declaration
 
Hallo,
nein, nicht korrekt verstanden.
Rufe die Patch-Methode im Constructor deiner abgeleiteten Klasse auf.

Somit ist der Patch immer automatisch gesetzt.

Delphi-Quellcode:
constructor TMyIBSQL.Create ...
begin
  inherited ....

  PatchIBSQLCursor(Self);
end;

stalkingwolf 7. Feb 2019 11:00

AW: SQL - Invalid cursor declaration
 
Ok ja. Das spart natürlich Arbeit.

Zitat:

Zitat von Union (Beitrag 1424941)
In neueren Versionen (hier 10.2.3) wird der Cursorname überhaupt nicht mehr gesetzt, dort entfällt das Problem, da isc_dsql_set_cursor_name nicht aufgerufen wird.

In 10.1 wird es noch im .prepare von TIBSQL aufgerufen.

Union 7. Feb 2019 11:27

AW: SQL - Invalid cursor declaration
 
Ein Cursor wird bei IB/FB nur für einen wahrscheinlich seltenen Anwendungsfall benötigt. Nämlich nur dann, wenn man positioned Updates durchführen möchte, also Spalten im Lesepuffer beim Lesen sperren möchte.

Select ... for update of ... with lock

Zitat:

Zitat von API-Doc
A cursor is a one-way pointer into the ordered set of rows retrieved by a statement. A
cursor is only needed to process positioned UPDATEand DELETEstatements made against
the rows retrieved by isc_dsql_fetch() for SELECT statements that specify an optional FOR
UPDATE OF clause.

Understanding the with lock clause


Alle Zeitangaben in WEZ +1. Es ist jetzt 21:36 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-2025 by Thomas Breitkreuz