Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Zugriff auf externe DB über Zeos und Spring4D (https://www.delphipraxis.net/196326-zugriff-auf-externe-db-ueber-zeos-und-spring4d.html)

marcibaer 11. Mai 2018 17:57

Datenbank: MySQL / MariaDB • Version: 10.0.32-0010 • Zugriff über: Zeos und Spring4D

Zugriff auf externe DB über Zeos und Spring4D
 
Hallo zusammen ...

Ich stehe gerade etwas auf dem Schlauch ...

Ich habe versucht, auf meine externe Maria-DB (auf meinem NAS) mit Hilfe von Zeos zuzugreifen, was auch geklappt hat.
Was ich aber jetzt nicht hinbekomme, ist der Zugriff über das ORM aus Spring4D!
Unter https://bitbucket.org/soundvibe/marshmallow/wiki/Home habe ich gesehen, dass ich wohl Adapters.Zeos benutzen muss, da es anscheinend keine direkten Adapter für MySQL / MariaDB gibt.
Unter "Sessions" ist dort Quellcode aufgeführt, mit dem ich eine Connection und eine Session für eine SQLite-DB bekommen kann. Was ich aber nicht finde, ist, wie ich das für meinen Zweck abändern muss - also, welche T?Database muss ich nutzen?
Eine TMySQLDatabase oder TZeosDatabase habe ich nicht gefunden.
Aus
Delphi-Quellcode:
Connection := TConnectionFactory.GetInstance(dtSQLite, TestDB);
muss dann wohl
Delphi-Quellcode:
Connection := TConnectionFactory.GetInstance(dtZeos, TestDB);
werden - das war's aber auch schon mit meinen Erkenntnissen ...

Brauche ich dann Zeos an sich noch oder läuft das dann alles über das ORM? Irgendwie fehlt mir noch der richtige "Anfang" ...

Vielen Dank für Eure Hilfe,

Marc

mkinzler 11. Mai 2018 21:08

AW: Zugriff auf externe DB über Zeos und Spring4D
 
TZeosConnectionAdapter aus Spring.Persistence.Adapters.Zeos.pas erwartet eine TZAbstractConnection.

TZMySqlDatabase sollte von der erben.

marcibaer 19. Mai 2018 16:38

AW: Zugriff auf externe DB über Zeos und Spring4D
 
Hallo mkinzler,

mit der Info habe ich Folgendes versucht:
Delphi-Quellcode:
var
  URL: TZURL;
  Connection: TZMySQLConnection;
  Adapter: TZeosConnectionAdapter;
begin
  URL := TZURL.Create();
  // URL belegen
  Connection := TZMySQLConnection.Create(URL);
  Adapter := TZeosConnectionAdapter.Create(Connection);
Leider kriege ich die Fehlermeldung "[DCC Fehler] Unit1.pas(57): E2250 Es gibt keine überladene Version von 'Create', die man mit diesen Argumenten aufrufen kann" in der letzten Zeile. Der TZeosConnectionAdapter-Konstruktor bekommt aber doch gerade eine
Delphi-Quellcode:
TZAbstractConnection
als Parameter, somit müsste eine
Delphi-Quellcode:
TZMySQLConnection
doch akzeptiert werden.

P.S.:
Delphi-Quellcode:
TZMySqlDatabase
habe ich nicht finden können!

Vielen Dank für die Hilfe,

Marc

Stevie 19. Mai 2018 16:58

AW: Zugriff auf externe DB über Zeos und Spring4D
 
Es gibt in Zeos 2 Klassen, die TZAbstractConnection heißen, einmal unter source/component und einmal unter source/dbc.

Du brauchst die, die von TComponent erbt, also so eine, wie man sie auf eine Form packen kann, die ist in der Unit ZConnection.pas
- dort die entsprechenden Einstellungen für MySQL tätigen
- den TZeosConnectionAdapter in einer Variable von IDBConnection (Spring.Persistence.Core.Interfaces.pas) speichern (wegen Referenzzählung und so)
- nicht vergessen, QueryLanguage der IDBConnection auf qlMSSQL (Spring.Persistence.SQL.Interfaces.pas) zu setzen, sonst spuckt der falsches SQL aus (die Adapter für Datenbank Komponenten, die mehrere Datenbanken ansprechen - so wie ZEOS, erkennen nicht von selber, auf welche Datenbank sie gehen)

MariaDB wird von Spring4D übrigens nicht offiziell unterstützt, aber alles was MySQL konform ist, müsste wohl funktionieren.

marcibaer 20. Mai 2018 15:01

AW: Zugriff auf externe DB über Zeos und Spring4D
 
Hallo Stefan,

vielen Dank! Das hat schon auf jeden Fall schon mal weiter geholfen ...
Jetzt verstehst Du vielleicht, warum ich Dir gestern die Vorschläge für die EKON geschickt hab!:)
Delphi-Quellcode:
var
  Connection: TZConnection;
  Adapter: IDBConnection;
  Session: TSession;
  Veranstaltung: TVeranstaltung;
  Veranstaltungen: IList<TVeranstaltung>;
  Anzahl: Word;
begin
  Connection := TZConnection.Create(nil);
  with Connection do
    begin
      Port := 1234;
      HostName := '1.2.3.4';
      User := 'Ich';
      Password := 'Passwort';
      Database := 'MyDB';
      Protocol := 'mysql';
    end;
  Adapter := TZeosConnectionAdapter.Create(Connection);
  with Adapter do
    begin
      QueryLanguage := 'qlMySQL';
      Connect;
    end;
  Session := TSession.Create(Adapter);
  Anzahl := Session.ExecuteScalar<Integer>('SELECT COUNT(*) FROM Veranstaltungen', []);
  Veranstaltung := Session.FindOne<TVeranstaltung>(1);
  Veranstaltungen := Session.FindAll<TVeranstaltung>();
Delphi-Quellcode:
ExecuteScalar()
funktioniert einwandfrei!
Bei den Aufrufen
Delphi-Quellcode:
FindOne()
und
Delphi-Quellcode:
FindAll()
erhalte ich aber die Exception-Klasse EListError mit Meldung 'Eintrag nicht gefunden' - ausgelöst in
Delphi-Quellcode:
TSQLGeneratorRegister.GetGenerator()
.

Was muss ich denn da noch registieren oder einbinden?

Viele Grüße,

Marc

marcibaer 21. Mai 2018 10:57

AW: Zugriff auf externe DB über Zeos und Spring4D
 
Mist ... Anfängerfehler ...

Es muss natürlich
Delphi-Quellcode:
Adapter.QueryLanguage := qlMySQL;
statt
Delphi-Quellcode:
Adapter.QueryLanguage := 'qlMySQL';
lauten!


Alle Zeitangaben in WEZ +1. Es ist jetzt 22:29 Uhr.

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