Fehlende ODBC Funktion (SQLCancel) unter FPC/Lazarus zur Verfügung stellen

Für Themen zu Datenbanken und Zugriff auf diese. Auch für Datenbankkomponenten.
Helios
Lazarusforum e. V.
Beiträge: 93
Registriert: Mi 29. Jun 2011, 22:36
OS, Lazarus, FPC: Lazarus 2.2.0 Windows 10 64Bit / Lazarus 2.0.12 Debian 11 „Bullseye" 64Bit
CPU-Target: 64Bit
Wohnort: Leonberg

Fehlende ODBC Funktion (SQLCancel) unter FPC/Lazarus zur Verfügung stellen

Beitrag von Helios »

Guten Morgen Forengemeinde,

bei der Arbeit mit den ODBC Komponenten in Lazarus, bin ich darüber gestolpert, dass nicht alle ODBC API DLL/Library Funktionen, zu finden unter:
https://docs.microsoft.com/en-us/sql/od ... rver-ver15
in Free Pascal/Lazarus umgesetzt sind.
Mir fehlt z.B. das SQLCancel (ja ich kämpfe immer noch mit langlaufenden SQL Abfragen, die ich sauber abbrechen möchte :roll: ):
https://docs.microsoft.com/en-us/sql/od ... rver-ver15
Z.B. das SQLAllocHandle (und weitere wichtige API Funktionen) finde ich unter Windows 10 in den Sourcen der FPC Packages unter
[Inst. Laufwerk]..\Lazarus\fpc\3.2.2\source\packages\odbc\src\odbcsql.inc
aber wie gesagt, das SQLCancel nicht. Kennt jemand den Grund dafür? Habe ich da was in FPC/Lazarus übersehen? Diese Funktion gibt es ja schon länger und einige ODBC Treiber haben die auch implementiert.
Dann gleich die Frage: Wie kompiliere ich denn (nur) dieses ODBC FPC Package (sofern ich mich trauen sollte, SQLCancel dort neu einzubinden) damit mir die SQLCancel Funktion auch unter Lazarus zur Verfügung steht?
Mit einer IDE Neukompilation ist es ja sicher nicht getan (die Änderungen stecken ja in den FPC Sourcen nicht in den IDE Sourcen, richtig?)
Danke im voraus
Gruß
Helios

Benutzeravatar
af0815
Lazarusforum e. V.
Beiträge: 5196
Registriert: So 7. Jan 2007, 10:20
OS, Lazarus, FPC: FPC fixes Lazarus fixes per fpcupdeluxe (win,linux,raspi)
CPU-Target: 32Bit (64Bit)
Wohnort: Niederösterreich
Kontaktdaten:

Re: Fehlende ODBC Funktion (SQLCancel) unter FPC/Lazarus zur Verfügung stellen

Beitrag von af0815 »

Es ist auch eine Frage was für eine ODBC Version auf welcher Plattform !!! unterstützt wird. Und ob die Sachen von M$ überhaupt auch auf anderen Plattformen vorhanden sind.

Wie du die fcl neu kompilieren kannst, hängt auch davon ab, wie du den fpc installiert hast und ob damit auch alle passenden Sourcen vorhanden sind.
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).

Helios
Lazarusforum e. V.
Beiträge: 93
Registriert: Mi 29. Jun 2011, 22:36
OS, Lazarus, FPC: Lazarus 2.2.0 Windows 10 64Bit / Lazarus 2.0.12 Debian 11 „Bullseye" 64Bit
CPU-Target: 64Bit
Wohnort: Leonberg

Re: Fehlende ODBC Funktion (SQLCancel) unter FPC/Lazarus zur Verfügung stellen

Beitrag von Helios »

Hallo af0815,
Danke für Deine Antwort.
Ich habe eine Standardinstallation von Lazarus 2.2.0 und FPC 3.2.2. unter Windows 10.
Clientseitig ein Impala ODBC Treiber (der Impala Server selbst ist UNIXoid, davon gehe ich aus).
https://www.cloudera.com/downloads/conn ... -6-11.html
der lt. meiner Kollegen die SQLCancel Funktion unterstützen soll.
Ich habe selber noch nie den FPC mit Sourcen kompiliert und unter Lazarus eingebunden.
Bei einer Änderung "nur" einer Library hatte ich die Hoffnung, dass das evtl. "minimalinvasiv" gehen könnte.
Meine Lazarus Installation ist grade so schön eingerichtet und nun so ein "Klops" :D
Gruß
Helios

charlytango
Beiträge: 490
Registriert: Sa 12. Sep 2015, 12:10
OS, Lazarus, FPC: Laz 2.0 fixes FPC 3.2 fixes
CPU-Target: Win 32Bit, 64bit
Wohnort: Wien

Re: Fehlende ODBC Funktion (SQLCancel) unter FPC/Lazarus zur Verfügung stellen

Beitrag von charlytango »

Helios hat geschrieben:
Sa 2. Apr 2022, 09:08
Meine Lazarus Installation ist grade so schön eingerichtet und nun so ein "Klops" :D
Obwohl ich beim eigentlichen Thema nicht wirklich helfen kann, aber früher war das installieren von unterschiedlichen Delphi-Versionen ein echtes Drama, da hat nur Virtualisierung geholfen.

Heutzutage ist der Aufwand mit Lazarus wesentlich kleiner. Es sind mit fpcupdeluxe mehrere unterschiedliche Lazarus-Installationen auf einem Rechner OHNE Virtualisierung absolut kein Problem. Lass doch deine aktuelle Installation so wie sie ist und installiere dir eine zweite in der du herumtestest. Ich habe zu diesem Zweck mehrere nebeneinander - funktioniert hervorragend.
fpcupdeluxe installiert dass sehr sauber und verlässlich.

Und seit man als Unit Output Directory eigene Pfade kombiniert mit OS und Lazarusversion angeben kann lassen sich die Kompilate auch sauber trennen (zb C:\Laz_Lib\<projektname>\$(TargetCPU)-$(TargetOS)-$(LazVer))

wp_xyz
Beiträge: 4323
Registriert: Fr 8. Apr 2011, 09:01

Re: Fehlende ODBC Funktion (SQLCancel) unter FPC/Lazarus zur Verfügung stellen

Beitrag von wp_xyz »

Helios hat geschrieben:
Sa 2. Apr 2022, 08:23
Dann gleich die Frage: Wie kompiliere ich denn (nur) dieses ODBC FPC Package (sofern ich mich trauen sollte, SQLCancel dort neu einzubinden) damit mir die SQLCancel Funktion auch unter Lazarus zur Verfügung steht?
Bei Veränderungen an FPC-Bibliotheken ist es lästig, dass man jedesmal den FPC neu kompilieren muss, was immer recht lang dauert - und üblicherweise wegen eines Tipp-Fehlers abbricht, zumindest bei mir...

Da aber ODBC ziemlich am Ende der Abhängigkeiten innerhalb der RTL/FCL-Units steht, würde ich in meinem Projekt ein Unterverzeichnis ODBC erzeugen und dort alle Dateien aus dem Order (fpc)/packages/fcl-db/src/sqldb/odbc und (fpc)/packages/odbc/src reinkopieren. Dann würde ich das Verzeichnis im Unit-Pfad des Projekts eintragen, so dass der Compiler die kopierten Units verwendet. Nun kannst du nach Belieben in den Quelldateien herumexperimentieren und kannst nichts kaputt machen, und vor allem geht alles viel schneller. Du darfst nur nicht published Properties verändern, denn sonst kommt Lazarus evtl. nicht mehr klar.

Schau dir das beigefügte Dummy-Projekt an: Ich habe die ODBC-Dateien von FPC 3.2.2 ins Projekt aufgenommen und den Constructor von TODBCConnection so verändert, dass eine Meldung auf der Konsole ausgegeben wird (DebugLn('ODBCConnection erzeugt')). - Funktioniert einwandfrei.

Wenn du aus irgendwelchen Gründen wieder die Original-Units verwenden willst, entferne das Verzeichnis aus dem Unit-Pfad des Projekts und lösche des Ausgabeverzeichnis deines Projekts (dort wo die ppu-Dateien stehen).

Falls du die SQLCancel-Funktion implementieren kannst, solltest du einen Patch erzeugen und an den Bug-Tracker schicken, damit deine Änderungen in die offizielle Version eingearbeitet werden können. Das wäre "Open Source at its best".
Dateianhänge
modify_ODBC.zip
(57.1 KiB) 38-mal heruntergeladen

Benutzeravatar
af0815
Lazarusforum e. V.
Beiträge: 5196
Registriert: So 7. Jan 2007, 10:20
OS, Lazarus, FPC: FPC fixes Lazarus fixes per fpcupdeluxe (win,linux,raspi)
CPU-Target: 32Bit (64Bit)
Wohnort: Niederösterreich
Kontaktdaten:

Re: Fehlende ODBC Funktion (SQLCancel) unter FPC/Lazarus zur Verfügung stellen

Beitrag von af0815 »

Wenn man sich den ODBC ansieht, so kann der sowohl dynamisch als auch statisch laden, daher sind die Änderungen in beiden Zweigen vorzunehmen und man muss auf die Version des ODBC-Treibers Rücksicht nehmen.

Aber eine Frage hätte ich noch, wo plaziert man die neue Routine, wenn man da was erweitert ? Ans Ende der Kette, weil die Reihenfolge der Statements ist für mich nicht ganz logisch ?!

Hat vielleicht wer einen Link, wo man die ODBC Spezifikationen für Linux findet. Linux ODBC für MSSQL habe ich hier gefunden https://docs.microsoft.com/en-us/sql/co ... rver-ver15

Aber wie sieht es mit anderen Servers aus ? ODBC auf Linux erscheint mit eine inhomogene Suppe mit vielen Köchen zu sein.
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).

Helios
Lazarusforum e. V.
Beiträge: 93
Registriert: Mi 29. Jun 2011, 22:36
OS, Lazarus, FPC: Lazarus 2.2.0 Windows 10 64Bit / Lazarus 2.0.12 Debian 11 „Bullseye" 64Bit
CPU-Target: 64Bit
Wohnort: Leonberg

Re: Fehlende ODBC Funktion (SQLCancel) unter FPC/Lazarus zur Verfügung stellen

Beitrag von Helios »

Hallo zusammen,
Danke für Eure Rückmeldungen:
@charlytango: Zum fpcupdeluxe habe ich schon einiges gelesen, das kommt bei mir bestimmt bald zum Einsatz wenn ich häufiger am FPC und an Lazarus an den Sourcen Anpassungen vornehmen muss. Dafür brauche ich aber mehr Erfahrung beginnend ab jetzt mit diesem konkreten Bedarf.
@wp_xyz: Das ist genau der präferierte Ansanz den ich mir erhofft hatte. Damit habe ich jetzt mal losgelegt...
@af0815: ... genau da (bzw. in dem Umfeld) bin ich jetzt bei der Umsetzung wie wp_xyz vorgeschlagen hat reingedappt. Wo kommt denn meine Cancel Funktion am besten rein?
Beim
- TODBCConnection,
- im TSQLQuery,
- oder im TSQLTransaction???
Eigentlich wäre der Abbruch eines SQL Statements ja am besten im TSQLQuery aufgehoben (sagt mir meine Intuition).
Ich hab es erstmal versucht in das TODBCConnection einzubauen, so hatte ich den Vorschlag von wp_xyz interpretiert und implementiert.
Im Projekt "modify_ODBC" von wp_xyz habe ich diese beiden Dateien entsprechend angepasst und hier angehängt.
Ein Aufruf dann a la

Code: Alles auswählen

...
Query.SQL.Text := 'SELECT * FROM messwerte';
...
ODBCConnection1.Cancel(TSQLHandle(Query.SQLConnection.Handle));
geht dann aber mit einem "Invalid Handle" schief und da ist auch mein Problem. Was genau ist denn das richtige Handle in diesem Fall?
Könnt ihr mir hier bitte nochmal auf die Sprünge helfen?
Danke und Gruß
Helios
Dateianhänge
odbc.zip
(28.71 KiB) 38-mal heruntergeladen

wp_xyz
Beiträge: 4323
Registriert: Fr 8. Apr 2011, 09:01

Re: Fehlende ODBC Funktion (SQLCancel) unter FPC/Lazarus zur Verfügung stellen

Beitrag von wp_xyz »

Helios hat geschrieben:
So 3. Apr 2022, 13:34
Ich hab es erstmal versucht in das TODBCConnection einzubauen, so hatte ich den Vorschlag von wp_xyz interpretiert und implementiert.
Nur um Missverständnissen vorzubeugen: Ich habe keine Ahnung, wie du das Cancel in ODBC einbauen kannst. Mein Beispiel war nun ein Test, ob man ein Projekt mit den vom FPC kopierten ODBC-Sourcen kompilieren kann.

Sieben
Beiträge: 174
Registriert: Mo 24. Aug 2020, 14:16
OS, Lazarus, FPC: Ubuntu Xenial 32, Lazarus 2.2.0, FPC 3.2.2
CPU-Target: i386

Re: Fehlende ODBC Funktion (SQLCancel) unter FPC/Lazarus zur Verfügung stellen

Beitrag von Sieben »

Was genau ist denn das richtige Handle in diesem Fall?
Ich schätze, du brauchst TODBCCursor.FSTMTHandle, siehe auch TODBCConnection.Execute(). Wenn du es von TSQLQuery aus machen willst, müsstest du versuchen, über die protected function Cursor an das Handle zu kommen. Das wäre dann allerdings keine 'generische' TSQLQuery mehr, sondern eine ODBC-spezifische.

Helios
Lazarusforum e. V.
Beiträge: 93
Registriert: Mi 29. Jun 2011, 22:36
OS, Lazarus, FPC: Lazarus 2.2.0 Windows 10 64Bit / Lazarus 2.0.12 Debian 11 „Bullseye" 64Bit
CPU-Target: 64Bit
Wohnort: Leonberg

Re: Fehlende ODBC Funktion (SQLCancel) unter FPC/Lazarus zur Verfügung stellen

Beitrag von Helios »

Hallo Sieben und wp_xyz,
danke für eure Rückmeldungen. Die SQL Komponenten sind ja ziemlich "verzahnt" das hatte ich unterschätzt. Auch dass das SQLQuery dann ODBC spezifisch wird (ist mir nicht aufgefallen). Evtl. wäre dann ein neues TSQLODBCQuery abgeleitet von TSQLQuery der richtige Ansatz. Ich schaue mal wie weit ich mit meinen (immer noch begrenzten) OOP und (systemtiefen) Pascal Kenntnissen komme und melde mich dann zurück.
Danke nochmal für eure Tipps!
Gruß
Helios

Sieben
Beiträge: 174
Registriert: Mo 24. Aug 2020, 14:16
OS, Lazarus, FPC: Ubuntu Xenial 32, Lazarus 2.2.0, FPC 3.2.2
CPU-Target: i386

Re: Fehlende ODBC Funktion (SQLCancel) unter FPC/Lazarus zur Verfügung stellen

Beitrag von Sieben »

Das Handle ist zwar wichtig, aber spannender dürfte die Frage sein, ob und wie du da irgendwie 'dazwischen' kommst, wenn das Statement erst mal läuft. Ich könnte mir zB vorstellen, dass es dazu einen Callback braucht, insofern wäre es schon hilfreich, sich mal eine bestehende Implementation anzusehen.

Helios
Lazarusforum e. V.
Beiträge: 93
Registriert: Mi 29. Jun 2011, 22:36
OS, Lazarus, FPC: Lazarus 2.2.0 Windows 10 64Bit / Lazarus 2.0.12 Debian 11 „Bullseye" 64Bit
CPU-Target: 64Bit
Wohnort: Leonberg

Re: Fehlende ODBC Funktion (SQLCancel) unter FPC/Lazarus zur Verfügung stellen

Beitrag von Helios »

Hallo zusammen,
das Problem hat mich immer noch im Griff. Als Anhang habe ich den aktuellen Stand meiner Erkenntnisse gepackt.
Da ich es nicht geschafft habe die SQLCancel Funktion der ODBC API in das TODBCConnect zu integrieren basiert die rudimentäre Lösung nun auf dem direkten Aufruf von SQLCancel und den anderen ODBC API Core Funktionen und im Verpacken des Ganzen in einen Thread. Ich gebe hier nur Strings in der Abfrage zurück (sollte zum Testen keine Einschränkung sein). Mit den ODBC Anbindungen via Firebird und Impala wird auch ein SQL Langläufer, der ausgeführt aber noch nicht in der Lage ist über Fetch bzw. Open Daten zu liefern, zeitnah abgebrochen. Damit wäre das primäre Ziel eigentlich erreicht. Ich glaube aber dass es mit einer Integration des SQLCancel in die FPC Library schöner und besser wäre. Vielleicht findet sich hier ja doch noch jemand, der diese Funktion nützlich findet und diese deutlich besser in der FCL integrieren kann.
Mich würde auch interessieren, ob z.B. andere ODBC Treiber mit dem angegebenen Projekt funktionieren (die Datei mit dem SQL Statement im Arbeitsverzeichnis sollte natürlich stimmen und die DSN (mit Hinterlegung Username und Passwort über die DSN im PDBC Configurator) sollte auch entsprechend angepasst werden, aber das wär es eigentlich, um die Funktion zu testen).
Danke für Euer Interesse und für evtl. weitere Rückmeldungen
Gruß
Helios
modify_ODBC_Version2.5_Forum.zip
(46.68 KiB) 18-mal heruntergeladen

charlytango
Beiträge: 490
Registriert: Sa 12. Sep 2015, 12:10
OS, Lazarus, FPC: Laz 2.0 fixes FPC 3.2 fixes
CPU-Target: Win 32Bit, 64bit
Wohnort: Wien

Re: Fehlende ODBC Funktion (SQLCancel) unter FPC/Lazarus zur Verfügung stellen

Beitrag von charlytango »

Helios hat geschrieben:
So 3. Apr 2022, 13:34
- im TSQLQuery,
- oder im TSQLTransaction???
Nur der Vollständigkeit halber... hast du es schon mal mit ZEOS versucht?
Möglicherweise gibt es bei dem Projekt ja auch jemand der dir die gewünschte Funktion einbaut

Soner
Beiträge: 513
Registriert: Do 27. Sep 2012, 00:07
OS, Lazarus, FPC: Win10Pro-64Bit, Immer letzte Lazarus Release mit SVN-Fixes
CPU-Target: x86_64-win64
Wohnort: Hamburg

Re: Fehlende ODBC Funktion (SQLCancel) unter FPC/Lazarus zur Verfügung stellen

Beitrag von Soner »

Helios hat geschrieben:
Sa 2. Apr 2022, 08:23
...
Dann gleich die Frage: Wie kompiliere ich denn (nur) dieses ODBC FPC Package (sofern ich mich trauen sollte, SQLCancel dort neu einzubinden) damit mir die SQLCancel Funktion auch unter Lazarus zur Verfügung steht?
Mit einer IDE Neukompilation ist es ja sicher nicht getan (die Änderungen stecken ja in den FPC Sourcen nicht in den IDE Sourcen, richtig?)
Danke im voraus
Gruß
Helios
1.
Du musst einfach Konsole aufrufen, dann zum Ordner wechseln:
[Inst. Laufwerk]..\Lazarus\fpc\3.2.2\source\packages\odbc

2. make aufrufen
dann wird nur diese Package compiliert und zwar in den Ordner:
[Inst. Laufwerk]..\Lazarus\fpc\3.2.2\source\packages\odbc\units\...

Im Konsolenfenster sieht man auch, wo die kompilierten Datein liegen.

3. All kompilierte Dateien in den folgenden Ordner verschieben:
[Inst. Laufwerk]..\Lazarus\fpc\3.2.2\units\x86_64-win64\odbc

"x86_64-win64" nur bei 64bit compiler, bei 32Bit-Compiler "i386-win32"


Falls dein fpc-bin-Ordner nicht in Pfadangaben steht, dann kannst du vor Schritt 2 so setzen:
set path=%path%;[Inst. Laufwerk]..\Lazarus\fpc\3.2.2\bin\x86_64-win64

Helios
Lazarusforum e. V.
Beiträge: 93
Registriert: Mi 29. Jun 2011, 22:36
OS, Lazarus, FPC: Lazarus 2.2.0 Windows 10 64Bit / Lazarus 2.0.12 Debian 11 „Bullseye" 64Bit
CPU-Target: 64Bit
Wohnort: Leonberg

Re: Fehlende ODBC Funktion (SQLCancel) unter FPC/Lazarus zur Verfügung stellen

Beitrag von Helios »

Hallo charlytango und soner,
Danke für eure Rückmeldungen.

@charlytango:
Die Umsetzung in ODBC ist die 1. Wahl und ich bin immer noch überzeugt, das sollte mit wenig Aufwand möglich sein und würde mit einem Schlag die Cancel Funktion standardmäßig für viele ODBC Datenbanken und Server (im Core FPC) verfügbar machen, bei dem diesses Feature im ODBC Treiber und auf dem Server umgesetzt ist. Bei zwei von zwei (ODBC fähigen) Datenbanken (Firebird und Impala) funktioniert es nachweislich (siehe das Projekt in meinem letzten Post) bisher ohne erkennenswerte Probleme (hoffentlich bleibt das so).

@soner:
Wenn ich die ODBCCancel Funktion (mit viel fremder Hilfe) in das ODBCConnection "reingefrickelt" bekomme, kommt Dein Tip zum Einsatz.
Wenn das dann geklappt hat, melde ich mich mit dem Ergebnis zurück bei euch.

Danke und Euch einen schönen Abend!
Helios

Antworten