MySQL Lösungen

Für Themen zu Datenbanken und Zugriff auf diese. Auch für Datenbankkomponenten.
Christian
Beiträge: 6079
Registriert: Do 21. Sep 2006, 07:51
OS, Lazarus, FPC: iWinux (L 1.x.xy FPC 2.y.z)
CPU-Target: AVR,ARM,x86(-64)
Wohnort: Dessau
Kontaktdaten:

MySQL Lösungen

Beitrag von Christian »

Hi,

Ich bin in SQL nicht der firmste. Nun soll der Netmonitor mal die ersten kleinen Schritte in Richtung SQL machen.
Dabei soll die interne dbf Tabelle mit der auf nem SQL Server abgeglichen werden. Das ganze passiert über einen Timestamp. Nun kann es aber sein das Datensätze schon vorhaden sind und nur mit zusätzlichen Daten ergänzt oder geändert wurden... Wie macht man sowas am besten ? Gibt es sowas wie nen merge Befehl ?
W.m.k.A.h.e.m.F.h. -> http://www.gidf.de/

Benutzeravatar
theo
Beiträge: 10864
Registriert: Mo 11. Sep 2006, 19:01

Beitrag von theo »

Ich würde mal sagen:
SELECT ID -> falls vorhanden UPDATE sonst INSERT
oder meinst du was anderes?

DiBo33
Beiträge: 334
Registriert: Do 11. Okt 2007, 18:01

Beitrag von DiBo33 »

MySQL sieht hierfür REPLACE vor.
http://dev.mysql.com/doc/refman/5.0/en/replace.html" onclick="window.open(this.href);return false;

monta
Lazarusforum e. V.
Beiträge: 2809
Registriert: Sa 9. Sep 2006, 18:05
OS, Lazarus, FPC: Linux (L trunk FPC trunk)
CPU-Target: 64Bit
Wohnort: Dresden
Kontaktdaten:

Beitrag von monta »

Ich würde es wie theo machen UPDATE und INSERT
Und vorher nen Select auf den Timestamp.
Johannes

Christian
Beiträge: 6079
Registriert: Do 21. Sep 2006, 07:51
OS, Lazarus, FPC: iWinux (L 1.x.xy FPC 2.y.z)
CPU-Target: AVR,ARM,x86(-64)
Wohnort: Dessau
Kontaktdaten:

Beitrag von Christian »

Das sind aber immer 2 Befehle Replace macht das selbe mit einem, danke DiBo. Gibts das nu bei MySQL oder ist das in allen aktuelleren datenbanken zu finden ?
W.m.k.A.h.e.m.F.h. -> http://www.gidf.de/

DiBo33
Beiträge: 334
Registriert: Do 11. Okt 2007, 18:01

Beitrag von DiBo33 »

Gibts das nu bei MySQL oder ist das in allen aktuelleren datenbanken zu finden ?
IMHO nur bei MySQL.
Bei Oracle und TSQL jedenfalls nicht.

monta
Lazarusforum e. V.
Beiträge: 2809
Registriert: Sa 9. Sep 2006, 18:05
OS, Lazarus, FPC: Linux (L trunk FPC trunk)
CPU-Target: 64Bit
Wohnort: Dresden
Kontaktdaten:

Beitrag von monta »

REPLACE ist meines Wissens kein Standard. Und ein MERGE gibt es erst im SQL-Standard 2003 der aber ja von keiner Datenbank voll unterstützt wird.

Daher bin ich auch für Select und Update, das funktioniert mit jeder SQL-Datenbank und nicht nur mit MySQL. Wenn dir das natürlich egal ist soricht nichts gegen Replace.
Johannes

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

Beitrag von af0815 »

Wenn es sehr kompatibel sein soll, dann SQL 92 Standard, das kann fast jede DB mittlerweile und somit am einfachsten mit dem SELECT/INSERT/UPDATE Gespann, wie bereits vorgeschlagen. Da kannst Du auch noch prüfen, ob sich an den Werten was geändert hat, oder nicht.

Das wichtigste ist das Grunddesign. Kniffelig wird es erst wenn mehrere Clients auf die DB können und zugleich was updaten sollen/können. Dort MUSS man dann das SELECT/INSERT/UPDATE als atomare Aktion vorsehen (Transaktionen).
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).

Christian
Beiträge: 6079
Registriert: Do 21. Sep 2006, 07:51
OS, Lazarus, FPC: iWinux (L 1.x.xy FPC 2.y.z)
CPU-Target: AVR,ARM,x86(-64)
Wohnort: Dessau
Kontaktdaten:

Beitrag von Christian »

Naja erstmal häng ich vorher ich will eine Abfrage ob die tabellen erstellt werden sollen wenn Sie nicht existieren. Ich dacht mir ich machs so:

Tables := TStringlist.Create;
SQLConnection.Transaction := SQLTransaction;
SQLConnection.GetTableNames(Tables);

Nur bekomm ich dabei die Fehlermeldung das keine Metadaten zu dieser Datenbankart existieren würden. Wie kann ioch das am besten lösen ?
CREATE IF NET EXISTS wollte ich bewusst vermeiden weil ich die Abfrage haben will...
W.m.k.A.h.e.m.F.h. -> http://www.gidf.de/

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

Beitrag von af0815 »

Vorschlag:

*) Prüfe ob du dich überhaupt auf die DB verbinden kannst.
*) Mache dann ein Select auf die Tabelle mit einer 'whereklausel' die keine Daten (oder wenige) liefert, aber du kannst sehen ob es einen Fehler gibt.

Frage:
Spezialisierst du dich auf eine DB oder willst du mehrere DB unterstützen ?
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).

Christian
Beiträge: 6079
Registriert: Do 21. Sep 2006, 07:51
OS, Lazarus, FPC: iWinux (L 1.x.xy FPC 2.y.z)
CPU-Target: AVR,ARM,x86(-64)
Wohnort: Dessau
Kontaktdaten:

Beitrag von Christian »

Vorerst ist nur MySQL geplant, ich wollts aber schon recht offen halten. Die Geschichte mit der select gefällt mir aber gar net jedesmal ne exeption beim debuggen wenn die Tabellen nicht existieren naja...
W.m.k.A.h.e.m.F.h. -> http://www.gidf.de/

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

Beitrag von af0815 »

Dann mach eine Geschäftslogik in der Mitte und lass die die exception schmeissen (ausserhalb des aktuellen Debuggers). Hat den Vorteil, das du dann dort die spezifikas des DBs hineinpackst.

Oder sag dem Debugger ganz einfach, das er die Exception ignorieren soll.
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).

Christian
Beiträge: 6079
Registriert: Do 21. Sep 2006, 07:51
OS, Lazarus, FPC: iWinux (L 1.x.xy FPC 2.y.z)
CPU-Target: AVR,ARM,x86(-64)
Wohnort: Dessau
Kontaktdaten:

Beitrag von Christian »

Jetzt bekomm ich keine Datensätze in die Datenbank, reicht ein insert nicht ?
Hab auch schon versucht mit ner Transaction vorher StartTransaction und nacher Commit zu machen bewirkt genau das selbe, nichts.
W.m.k.A.h.e.m.F.h. -> http://www.gidf.de/

monta
Lazarusforum e. V.
Beiträge: 2809
Registriert: Sa 9. Sep 2006, 18:05
OS, Lazarus, FPC: Linux (L trunk FPC trunk)
CPU-Target: 64Bit
Wohnort: Dresden
Kontaktdaten:

Beitrag von monta »

Doch, ein INSERT und anschließendes COMMIT/COMMITRETAINING sollte langen.

Wie sieht denn deine INSERT-Syntax aus?
Johannes

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

Beitrag von af0815 »

ApplyUpdates (Nach dem Insert's) auch aufgerufen?
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).

Antworten