Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   uniDAC 2 Datenbanken Abfrage (https://www.delphipraxis.net/189791-unidac-2-datenbanken-abfrage.html)

Devil1925 21. Jul 2016 14:59

Datenbank: MSSQL / SQLITE • Version: -- • Zugriff über: uniDAC 6.3.13

uniDAC 2 Datenbanken Abfrage
 
Hallo, ich habe folgende Problematik und bin mir derzeit noch unsicher wie ich da ran gehen sollte:

Ich habe 2 Datenbanken, einmal eine MSSQL Datenbank und einmal eine SQLITE Datenbank. Hier kommt es nun vor, dass auf beiden Seiten Änderungen an den Daten vorgenommen werden.
Hierzu möchte ich auf der MSSQL - Datenbank alle Datensätze selektieren, welche hier ein Changed_Last haben, welches nach meinem LastTransfer - Datum liegt sowie alle Datensätze, welche auf der SQLITE Datenbank ein Changed_Last nach dem LastTransfer Datum haben. Wie bekomme ich jetzt diese Abfrage hin? ist es irgendwie möglich die Datenmenge einer UniQuery als Parameter an eine andere UniQuery zu übergeben oder was tue ich da am sinnvollsten?

himitsu 21. Jul 2016 15:07

AW: uniDAC 2 Datenbanken Abfrage
 
MSSQL sollte auch sowas wie Database-Links können, zu einer anderen MSSQL-DB oder gar einem fremden DBMS,
also wo du dann in MSSQL eine "virtuelle" Tabelle hast, mit den Daten aus der SQLITE.
Oder wo man zumindestens sowas wie ein "externes SELECT" innerhalb der einen DB auf einer anderen DB ausführen lassen kann und das Result zurück bekommt.
Und da kannst du dann ganz billig beide Tabellen JOINen und sonstwas mit denen anstellen. :angle:

Ansonsten kann man natürlich immer zwei Queries im Programm aufmachen und da z.B. mit LOCATE manuell rumsuchen.

Von einer MSSQL-DB zu einer Anderen ginge sowas
Delphi-Quellcode:
select * from [serverlink].[database].[schema].[table]
(Irgendein Blog)
und für fremde DBMS wird man eventuell noch einen Wrapper dazischen schalten müssen.

Devil1925 21. Jul 2016 15:14

AW: uniDAC 2 Datenbanken Abfrage
 
Ich habe halt die Thematik, das die SQLITE Datenbank lokal auf einem Tablet liegt und ich eine Abfrage an den MSSQL-Server sende. Von diesen Tablets kann es Beliebig viele geben. Da hilft mir soweit ich weiss kein Database-Link, da ich das Ganze von der Geräteseite aus betrachte.
Oder habe ich da jetzt falsch gedacht?

himitsu 21. Jul 2016 15:18

AW: uniDAC 2 Datenbanken Abfrage
 
Hmmm, dann müsste der Link wohl in die SQLITE, aber k.A. ob die sowas kann.

In PostgreSQL kann man sowas per SQL zur Laufzeit definieren, aber auch da bräuchte man natürlich von "außen" Zugriff auf die DB, also z.B. die SQLITE, wenn es vom MSSQL ausgehen würde.

Sir Rufo 21. Jul 2016 15:45

AW: uniDAC 2 Datenbanken Abfrage
 
MSSQL bietet eine Datentyp RowVersion an, der für jeden Tabelleneintrag eindeutig ist (innerhalb der Datenbank).

Beim Abgleich fragst du also einfach alle Tabellen ab wo die RowVersion größer ist als der letzte Abgleich ergeben hat. Die höchste RowVersion merkst du dir nach dem Abgleich.

Devil1925 21. Jul 2016 15:52

AW: uniDAC 2 Datenbanken Abfrage
 
Mein hauptproblem ist derzeit, dass ich die beiden Datenbanken irgendwie in einer Abfrage unter einen Hut bekommen muss. Welche seid dem Letzten mal aktualisiert wurden erkenne ich an dem Feld "Changed_Last", welches ich mit dem Datum des Letzten Datenabgleichs vergleiche. Das Funktioniert Prima, allerdings muss ich jetzt irgendwie eine Abfrage machen, welche über beide Datenbanken die Tabellen abfragen kann, wo die Daten geändert wurden. Sowohl in der MSSQL als auch in der SQLITE Datenbank.

Sir Rufo 21. Jul 2016 15:55

AW: uniDAC 2 Datenbanken Abfrage
 
Hmmm, n Tabellen in einer Abfrage ist schon schwierig.

Du willst also in beide Richtungen abgleichen?

himitsu 21. Jul 2016 16:15

AW: uniDAC 2 Datenbanken Abfrage
 
Hab es so verstanden: SELECT auf beide Tabellen und jeweils nur das Größere, von zusammenhängenden Datensätzen (gleiche ID, oder so)

Halt entweder Clientseitig, meist manuell beide SELECTs und dann z.B. in einer MemoryTable zusammenmischen
oder per DatabaseLink, wo man das per JOIN/UNION so zusammenhauen kann, als wären beide Tabellen in einer DB drin.

Sir Rufo 21. Jul 2016 18:52

AW: uniDAC 2 Datenbanken Abfrage
 
Hmmm, wenn ich weiß welche Datensätze auf dem Server geändert wurden (über den quasi Timestamp Wert) dann eine Abfrage auf dem Server und diese Datensätze im Client eintragen.

Mit einer Query und Parametern läuft man durch das Dataset vom Server und ruft nur noch ExecSQL auf der Query für die lokale Datenbank auf.

Etwas aufwändiger wird es wenn man in beide Richtungen synchronisieren will. Dann muss man Änderungen am Server und lokal erkennen und entscheiden was passieren soll wenn Änderungen auf beiden Seiten vorhanden sind.

Auf der lokalen Datenbank benötigt man dann Felder wie
- Id (lokal) NOT NULL
- Version (lokal) (z.B. ein Timestamp) NULL
- RemoteId NULL
- RemoteVersion NULL
um diese Fälle zu ermitteln.


Alle Zeitangaben in WEZ +1. Es ist jetzt 22:02 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