ZEOS und SQLdb
-
- Beiträge: 1061
- Registriert: Sa 12. Sep 2015, 12:10
- OS, Lazarus, FPC: Laz stable (2.2.6, 3.x)
- CPU-Target: Win 32/64, Linux64
- Wohnort: Wien
ZEOS und SQLdb
Hi,
ich habe ZEOS jahrelang verwendet ohne groß darüber nachzudenken nachdem die Verbindung zur DB immer stabil war und ist.
Mit meinem Datenbank-Zugriffs-Framework, das ich bewusst auf SQLDB ausgerichtet habe wurde der Prozess der DB-Verbindung um einiges umfangreicher und benutzerfreundlicher gemacht.
Nun möchte ich das Framework auch auf ZEOS anpassen und scheitere im Moment daran dass ich nicht an die Standardnamen der jeweiligen (durch die Protokollbezeichnung definierten) Zugriffsbibliotheken komme. SQLdb kann das mittels GetStandardLibraryName(ConnectorType) -- ähnliches suche ich eben auch bei ZEOS.
Das Beispielprojekt ZControlsExample zeigt dass es so etwas ähnliches wie den SQLConnector in SQLdb geben muss, denn allein nur durch Eingabe des Protokolls war eine Verbindung möglich.
Die TZConnection von ZEOS ist nur ein Wrapper für TZAbstractConnection wobei ich nicht heraus bekommen habe wie und wo entschieden wird welche Bibliothek genommen wird.
Könnte mich da bitte jemand auf die richtige Spur bringen?
THX
ich habe ZEOS jahrelang verwendet ohne groß darüber nachzudenken nachdem die Verbindung zur DB immer stabil war und ist.
Mit meinem Datenbank-Zugriffs-Framework, das ich bewusst auf SQLDB ausgerichtet habe wurde der Prozess der DB-Verbindung um einiges umfangreicher und benutzerfreundlicher gemacht.
Nun möchte ich das Framework auch auf ZEOS anpassen und scheitere im Moment daran dass ich nicht an die Standardnamen der jeweiligen (durch die Protokollbezeichnung definierten) Zugriffsbibliotheken komme. SQLdb kann das mittels GetStandardLibraryName(ConnectorType) -- ähnliches suche ich eben auch bei ZEOS.
Das Beispielprojekt ZControlsExample zeigt dass es so etwas ähnliches wie den SQLConnector in SQLdb geben muss, denn allein nur durch Eingabe des Protokolls war eine Verbindung möglich.
Die TZConnection von ZEOS ist nur ein Wrapper für TZAbstractConnection wobei ich nicht heraus bekommen habe wie und wo entschieden wird welche Bibliothek genommen wird.
Könnte mich da bitte jemand auf die richtige Spur bringen?
THX
- af0815
- Lazarusforum e. V.
- Beiträge: 6770
- Registriert: So 7. Jan 2007, 10:20
- OS, Lazarus, FPC: FPC fixes Lazarus fixes per fpcupdeluxe (win,linux,raspi)
- CPU-Target: 32Bit (64Bit)
- Wohnort: Burgenland
- Kontaktdaten:
Re: ZEOS und SQLdb
Etwas, du kannst direkt im ZEOS Forum fragen, dort können sie dir das sicher helfen.
Im anderen Fall, man kann bei ZEOS das auch direkt angeben, das ging bei SQLDB ursprünglich nicht so einfach, schau mal in die Connection unter "LibraryLocation" . Älteres Codeschnipsel
Wenn du mehr wissen willst, so musst du in den entsprechenden Treiber gehen, in der allgemeinen TZConnection wirst du nichts finden, weil erst zur Laufzeit, wie bei SQLdb, wird der richtige Teil geladen.
Im anderen Fall, man kann bei ZEOS das auch direkt angeben, das ging bei SQLDB ursprünglich nicht so einfach, schau mal in die Connection unter "LibraryLocation" . Älteres Codeschnipsel
Code: Alles auswählen
...
SQLCon.Protocol := 'FreeTDS_MsSQL-2000';
SQLCon.LibraryLocation:= '/usr/lib/x86_64-linux-gnu/libsybdb.so.5.0.0';
...
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).
-
- Beiträge: 1061
- Registriert: Sa 12. Sep 2015, 12:10
- OS, Lazarus, FPC: Laz stable (2.2.6, 3.x)
- CPU-Target: Win 32/64, Linux64
- Wohnort: Wien
Re: ZEOS und SQLdb
Hab ich schon vor diesem Post erledigt, die sind aber längst nicht so flink wie hieraf0815 hat geschrieben: Do 29. Dez 2022, 16:11 Etwas, du kannst direkt im ZEOS Forum fragen, dort können sie dir das sicher helfen.

Da muss ein Admin erst das Thema freigeben.
Den Verdacht hatte ich eh. Nur müsste es da irgendwo doch eine Art Dispatcher geben der den entsprechenden Treiber lädt. Aber ich suche weiter ....af0815 hat geschrieben: Do 29. Dez 2022, 16:11 Wenn du mehr wissen willst, so musst du in den entsprechenden Treiber gehen, in der allgemeinen TZConnection wirst du nichts finden, weil erst zur Laufzeit, wie bei SQLdb, wird der richtige Teil geladen.
- af0815
- Lazarusforum e. V.
- Beiträge: 6770
- Registriert: So 7. Jan 2007, 10:20
- OS, Lazarus, FPC: FPC fixes Lazarus fixes per fpcupdeluxe (win,linux,raspi)
- CPU-Target: 32Bit (64Bit)
- Wohnort: Burgenland
- Kontaktdaten:
Re: ZEOS und SQLdb
Da wird anhand der Vorgabe der richtige Teil erzeugt, wie bei einer Fabrik. Daher ist es einfacher gleich in den richtigen Bereichen zu suchen. Und das ist mal die spezialisierte Schicht.charlytango hat geschrieben: Do 29. Dez 2022, 19:28 Den Verdacht hatte ich eh. Nur müsste es da irgendwo doch eine Art Dispatcher geben der den entsprechenden Treiber lädt. Aber ich suche weiter ....
Es ist bei ZEOS nur mehr in feinere Module unterteilt. Du findest vielleicht was du suchst im zeosdbo\src\plain Verzeichnis. Ich glaube das der ZPlainLoader.pas dann die nativen Treiberteile läd.
Zum Beispiel findet man im ZPlainDbLibDriver.pas die folgenden Definitionen
Code: Alles auswählen
const
NTWDBLIB_DLL_LOCATION ='ntwdblib.dll';
LIBSYBDB_WINDOWS_DLL_LOCATION = 'libsybdb.dll';
LIBSYBDB_LINUX_DLL_LOCATION = 'libsybdb.so';
FREETDS_MSSQL_WINDOWS_DLL_LOCATION = 'sybdb.dll';
FREETDS_LINUX_DLL_LOCATION = 'dblib.so';
FREETDS_OSX_DLL_LOCATION = 'dblib.dylib';
FREETDS_SYBASE_WINDOWS_DLL_LOCATION = 'sybdb.dll';
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).
-
- Beiträge: 1061
- Registriert: Sa 12. Sep 2015, 12:10
- OS, Lazarus, FPC: Laz stable (2.2.6, 3.x)
- CPU-Target: Win 32/64, Linux64
- Wohnort: Wien
Re: ZEOS und SQLdb
zumindest so etwas ähnliches.
In den einzelnen ZPlainXXXXDriver (zB ZPlainMySqlDriver) sind spezifische constanten mit den gesuchten Informationen.
Code: Alles auswählen
const
MARIADB_LOCATION = 'libmariadb'+ SharedSuffix;
{$IFNDEF UNIX}
{$IFNDEF MYSQL_STRICT_DLL_LOADING}
WINDOWS_DLL_LOCATION = 'libmysql.dll';
WINDOWS_DLL_LOCATION_EMBEDDED = 'libmysqld.dll';
{$ENDIF}
WINDOWS_DLL41_LOCATION = 'libmysql41.dll';
WINDOWS_DLL41_LOCATION_EMBEDDED = 'libmysqld41.dll';
WINDOWS_DLL50_LOCATION = 'libmysql50.dll';
WINDOWS_DLL50_LOCATION_EMBEDDED = 'libmysqld50.dll';
WINDOWS_DLL51_LOCATION = 'libmysql51.dll';
WINDOWS_DLL51_LOCATION_EMBEDDED = 'libmysqld51.dll';
WINDOWS_DLL55_LOCATION = 'libmysql55.dll';
WINDOWS_DLL55_LOCATION_EMBEDDED = 'libmysqld55.dll';
WINDOWS_DLL56_LOCATION = 'libmysql56.dll';
WINDOWS_DLL56_LOCATION_EMBEDDED = 'libmysqld56.dll';
WINDOWS_DLL57_LOCATION = 'libmysql57.dll';
WINDOWS_DLL57_LOCATION_EMBEDDED = 'libmysqld57.dll';
{$ELSE}
{$IFNDEF MYSQL_STRICT_DLL_LOADING}
LINUX_DLL_LOCATION = 'libmysqlclient'+SharedSuffix;
LINUX_DLL_LOCATION_EMBEDDED = 'libmysqld'+SharedSuffix;
{$ENDIF}
LINUX_DLL41_LOCATION = 'libmysqlclient'+SharedSuffix+'.14';
LINUX_DLL41_LOCATION_EMBEDDED = 'libmysqld'+SharedSuffix+'.14';
LINUX_DLL50_LOCATION = 'libmysqlclient'+SharedSuffix+'.15';
LINUX_DLL50_LOCATION_EMBEDDED = 'libmysqld'+SharedSuffix+'.15';
LINUX_DLL51_LOCATION = 'libmysqlclient'+SharedSuffix+'.16';
LINUX_DLL51_LOCATION_EMBEDDED = 'libmysqld'+SharedSuffix+'.16';
LINUX_DLL55_LOCATION = 'libmysqlclient'+SharedSuffix+'.18';
LINUX_DLL55_LOCATION_EMBEDDED = 'libmysqld'+SharedSuffix+'.18';
LINUX_DLL56_LOCATION = 'libmysqlclient'+SharedSuffix+'.19';
LINUX_DLL56_LOCATION_EMBEDDED = 'libmysqld'+SharedSuffix+'.19';
LINUX_DLL57_LOCATION = 'libmysqlclient'+SharedSuffix+'.20';
LINUX_DLL57_LOCATION_EMBEDDED = 'libmysqld'+SharedSuffix+'.20';
{$ENDIF}

Ausgehend von der ZEOS Demo hangle ich mich vorwärts.
Hier wird eine Combobox mit den möglichen Protokollen befüllt, dann hab ich etwas rumgetestet.
Code: Alles auswählen
procedure TMainForm.FormShow(Sender: TObject);
var
I, J: Integer;
Drivers: IZCollection;
Protocols: TStringDynArray;
URL:TZURL;
Plaindriver:IZPLaindriver;
ADriver:IZDriver;
s,t:string;
begin
ZProtocol.Clear; //combobox löschen
Drivers := DriverManager.GetDrivers;
for I := 0 to Drivers.Count - 1 do
begin
Protocols := (Drivers.Items[I] as IZDriver).GetSupportedProtocols;
for J := 0 to High(Protocols) do begin
s:='nix';
t:='nix';
ZProtocol.Items.Add(Protocols[J]); //Das klappt, die Protokolle werden ausgefüllt
URL:=TZURL.Create;
URL.Protocol:=Protocols[J];
Plaindriver:=(Drivers.Items[I] as IZDriver).GetPlainDriver(URL,false);
if assigned(Plaindriver) then begin
s:=Plaindriver.GetProtocol; //ist der gleiche Wert wie Protocols[J]
t:=Plaindriver.GetDescription; //ist eine Beshreibung wie: Native dblib driver for MS SQL 7+
end;
//ADriver:=(Drivers.Items[I] as IZDriver);
//ADriver.GetPropertyInfo(); //hat nicht geklappt weil ich noch keine passenden parameter finde
//keine ahnung was da ginge
Memo1.Append('');
Memo1.Append(Protocols[J]);
Memo1.Append(' '+s);
Memo1.Append(' '+t);
Plaindriver:=nil;
url.free;
end;
//(Drivers.Items[I] as IZDriver).
//(Drivers.Items[I] as IZInterface).
//Drivers.Items[i].
end;
ZProtocol.Sorted := True;
end;

und noch keine Reaktion aus dem ZEOS Forum
- af0815
- Lazarusforum e. V.
- Beiträge: 6770
- Registriert: So 7. Jan 2007, 10:20
- OS, Lazarus, FPC: FPC fixes Lazarus fixes per fpcupdeluxe (win,linux,raspi)
- CPU-Target: 32Bit (64Bit)
- Wohnort: Burgenland
- Kontaktdaten:
Re: ZEOS und SQLdb
Bitte bei den Beispielen, nichts im FormShow machen, leg das bitte immer auf einen Button. So ist das auch besser zu debuggen und es kracht nicht gleich beim Öffenen. Und die uses Zeile zu kennen ist auch kein Fehler. Weil das Snippet ist wertlos ohne dem. Man braucht verdammt lange um so ein blödes Schnippsel zum laufen zu bringen. Das macht keinen Spaß.
Zuletzt geändert von af0815 am Fr 30. Dez 2022, 11:16, insgesamt 1-mal geändert.
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).
-
- Beiträge: 1061
- Registriert: Sa 12. Sep 2015, 12:10
- OS, Lazarus, FPC: Laz stable (2.2.6, 3.x)
- CPU-Target: Win 32/64, Linux64
- Wohnort: Wien
Re: ZEOS und SQLdb
Stimme dir da voll zu, ist nur nicht mein Beispiel sondern eines aus der ZEOS Komponente. Und zu deren Entlastung: Das ursprüngliche FormShow hat nur eine Combobox mit Daten aus der Komponente befüllt.af0815 hat geschrieben: Fr 30. Dez 2022, 11:04 Bitte bei den Beispielen, nichts im FormShow machen, leg das bitte immer auf einen Button. So ist das auch besser zu debuggen und es kracht nicht gleich beim Öffenen. Und die uses Zeile zu kennen ist auch kein Fehler.
Den eigentlichen Connect haben sie eh in einen Button gelegt.
Das Beispiel liegt in
\onlinepackagemanager\packages\zeosdbo\examples\controls
Code: Alles auswählen
uses
{$IFNDEF VER130BELOW}
Types,
{$ENDIF}
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, DB, StdCtrls, ExtCtrls, Buttons, ComCtrls, Grids, DBGrids, Masks, DBCtrls,
ExtDlgs,
ZAbstractRODataset, ZAbstractDataset, ZDataset, ZConnection,
ZSqlMetadata, ZSqlMonitor, ZDbcLogging
,ZURL,ZPlainDriver; //<<- die sind von mir zum Testen eingefügt
-
- Beiträge: 1061
- Registriert: Sa 12. Sep 2015, 12:10
- OS, Lazarus, FPC: Laz stable (2.2.6, 3.x)
- CPU-Target: Win 32/64, Linux64
- Wohnort: Wien
Re: ZEOS und SQLdb
hab gerade aus dem ZEOS Forum Antwort erhalten, leider scheint mit dem Forum etwas nicht zu stimmen und hat die Antwortposts verschluckt.
Das was ich rauslesen konnte was :
Wenn Portnummer und Linbratyname leer bleiben versucht ZEOS die aus eigenen Informationen zu füllen und sucht auch die Zugriffsbibliothek die zum gewählten Server passt.
Eine externe Abfrage des Standard-Bibliotheksnamens scheint nicht vorgesehen zu sein.
Außerdem weiß ich ja nicht wo ZEOS die dlls sucht.
Noch etwas nebelig alles aber zumindestens etwas klarer
Das was ich rauslesen konnte was :
Wenn Portnummer und Linbratyname leer bleiben versucht ZEOS die aus eigenen Informationen zu füllen und sucht auch die Zugriffsbibliothek die zum gewählten Server passt.
Eine externe Abfrage des Standard-Bibliotheksnamens scheint nicht vorgesehen zu sein.
Außerdem weiß ich ja nicht wo ZEOS die dlls sucht.
Noch etwas nebelig alles aber zumindestens etwas klarer
- af0815
- Lazarusforum e. V.
- Beiträge: 6770
- Registriert: So 7. Jan 2007, 10:20
- OS, Lazarus, FPC: FPC fixes Lazarus fixes per fpcupdeluxe (win,linux,raspi)
- CPU-Target: 32Bit (64Bit)
- Wohnort: Burgenland
- Kontaktdaten:
Re: ZEOS und SQLdb
Geladen wird reletiv universell über den TZNativeLibraryLoader (ZPlainLoader) über den könnte man auch die CurentLocation auslesen, wenn man hinkommen würde.
Edit: Was ungewohnt für die meisten ist, ZEOS ist sehr stark auf Interfaces basierend. Das hat einen riesigen Vorteil, dam man wirklich über Kontrakte (=Interfaces) programmiert und dadurch die einzelnen Module gegenseitig sehr stark getrennt sind. Zum Suchen ist es eher unübersichtlich, wenn man das nicht gewöhnt ist.
Edit: Was ungewohnt für die meisten ist, ZEOS ist sehr stark auf Interfaces basierend. Das hat einen riesigen Vorteil, dam man wirklich über Kontrakte (=Interfaces) programmiert und dadurch die einzelnen Module gegenseitig sehr stark getrennt sind. Zum Suchen ist es eher unübersichtlich, wenn man das nicht gewöhnt ist.
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).
-
- Beiträge: 1061
- Registriert: Sa 12. Sep 2015, 12:10
- OS, Lazarus, FPC: Laz stable (2.2.6, 3.x)
- CPU-Target: Win 32/64, Linux64
- Wohnort: Wien
- af0815
- Lazarusforum e. V.
- Beiträge: 6770
- Registriert: So 7. Jan 2007, 10:20
- OS, Lazarus, FPC: FPC fixes Lazarus fixes per fpcupdeluxe (win,linux,raspi)
- CPU-Target: 32Bit (64Bit)
- Wohnort: Burgenland
- Kontaktdaten:
Re: ZEOS und SQLdb
Die Antwort bezüglich der Ports von Jan ist klar, besonders der Hinweis bezüglich des MS SQL Treibers und der verwendeten Ports.charlytango hat geschrieben: Fr 30. Dez 2022, 15:29 die Antwort aus dem Forum:
https://zeoslib.sourceforge.io/viewtopi ... 0&t=176179
Der Rest ist für ihn deswegen abstrakt, weil Zeos ein ziemlich ausgeklügeltes System zum Finden der Treiber hat und wenn das nicht ausreicht, man selbst auch noch den Treiber vorgeben kann. Das ist vergleichbar, wenn du die Suche nach dem Treiber immer machst und ZEOS immer den Treiber mitteilst. Das Abfragen wo gesucht wird ist ja so ein Hybridweg. Wenn du das Vereinheitlichen willst, so müsstest du immer den (richtigen) Treiber suchen und ihm ZEOS oder SQLdb direkt angeben. Das ist auch das was Jan im zweiten Thread dir mehr oder weniger gesagt hat.
ZEOS kann aber einige Datenbanken mehr als SQLdb, besonders unter Windows ist ADO nicht ganz uninteressant. Für SQLdb ist das kein Target, weil wieder Windows-Only.
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).