ZEOS und SQLdb

Für Themen zu Datenbanken und Zugriff auf diese. Auch für Datenbankkomponenten.
Antworten
charlytango
Beiträge: 843
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

Beitrag von charlytango »

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

Benutzeravatar
af0815
Lazarusforum e. V.
Beiträge: 6209
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

Beitrag von af0815 »

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

Code: Alles auswählen

      ...
       SQLCon.Protocol := 'FreeTDS_MsSQL-2000';
       SQLCon.LibraryLocation:= '/usr/lib/x86_64-linux-gnu/libsybdb.so.5.0.0';
       ...
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.
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).

charlytango
Beiträge: 843
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

Beitrag von charlytango »

af0815 hat geschrieben:
Do 29. Dez 2022, 16:11
Etwas, du kannst direkt im ZEOS Forum fragen, dort können sie dir das sicher helfen.
Hab ich schon vor diesem Post erledigt, die sind aber längst nicht so flink wie hier ;-)
Da muss ein Admin erst das Thema freigeben.
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.
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 ....

Benutzeravatar
af0815
Lazarusforum e. V.
Beiträge: 6209
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

Beitrag von af0815 »

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 ....
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.

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';
Ich glaube das suchst du.
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).

charlytango
Beiträge: 843
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

Beitrag von charlytango »

af0815 hat geschrieben:
Do 29. Dez 2022, 19:40
Ich glaube das suchst du.
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}
Nur komme ich bis jetzt von außen nicht ran. Wohl vor allem weil die Art des Codes für mich zwei Level über meiner Art zu Programmieren liegt ;-)

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;                      
Soweit kam ich bisher :-(
und noch keine Reaktion aus dem ZEOS Forum

Benutzeravatar
af0815
Lazarusforum e. V.
Beiträge: 6209
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

Beitrag von af0815 »

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).

charlytango
Beiträge: 843
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

Beitrag von charlytango »

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.
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.
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

charlytango
Beiträge: 843
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

Beitrag von charlytango »

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

Benutzeravatar
af0815
Lazarusforum e. V.
Beiträge: 6209
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

Beitrag von af0815 »

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.
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).

charlytango
Beiträge: 843
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

Beitrag von charlytango »


Benutzeravatar
af0815
Lazarusforum e. V.
Beiträge: 6209
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

Beitrag von af0815 »

charlytango hat geschrieben:
Fr 30. Dez 2022, 15:29
die Antwort aus dem Forum:
https://zeoslib.sourceforge.io/viewtopi ... 0&t=176179
Die Antwort bezüglich der Ports von Jan ist klar, besonders der Hinweis bezüglich des MS SQL Treibers und der verwendeten Ports.

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).

Antworten