ZEOS Insert, Update und Delete

Für Themen zu Datenbanken und Zugriff auf diese. Auch für Datenbankkomponenten.
Benutzeravatar
Zvoni
Beiträge: 434
Registriert: Fr 5. Jul 2024, 08:26
OS, Lazarus, FPC: Windoof 10 Pro (Laz 2.2.2 FPC 3.2.2)
CPU-Target: 32Bit
Wohnort: BW

Re: ZEOS Insert, Update und Delete

Beitrag von Zvoni »

af0815 hat geschrieben: Fr 20. Sep 2024, 12:30 Die Queries von ZEOS und SQLdb versuchen die Statement für UPDATE, INSERT und DELETE zu erraten. Das geht öfters nicht (weil z.B. der Primärschlüssel nicht bekannt ist), dann kann die Query halt nur SELECT. Für die anderen Sachen (UPDATE,...) gibt es dann die Möglichkeit eigen Statements zu definieren und dann ist die Query auch in der Lage Einzufügen, Löschen oder Updaten.

Bei SQLdb heissen die Eigenschaften UpdateSQL, InsertSQL und DeleteSQL (und ein UpdateSQL gibt es auch). Bei ZEOS werden die so ähnlich heissen.
Ich finde das dermassen fürchterlich, dass es das gibt.
Entweder ich kann SQL, oder ich kann es nicht.
Aber ich verlasse mich garantiert nicht darauf, dass auf Basis eines Algorithmus, der von jemandem entwickelt wurde, diese INSERT/UPDATE/DELETE-Statements erraten werden.

Do it yourself lautet die Maxime
Ein System sie alle zu knechten, ein Code sie alle zu finden,
Eine IDE sie ins Dunkel zu treiben, und an das Framework ewig zu binden,
Im Lande Redmond, wo die Windows drohn.

Benutzeravatar
juelin
Beiträge: 310
Registriert: Sa 24. Jul 2021, 18:03
OS, Lazarus, FPC: Linux Ubuntu 22. Windows 10 Delphi 11.3 (L 0.9.xy FPC 2.2.z)
CPU-Target: 64Bit
Wohnort: Mannheim

Re: ZEOS Insert, Update und Delete

Beitrag von juelin »

Also ich bleibe bei ZConnection Disconnect/Connect das funktioniert wenigstens.
Alles Andere ist gut gemeint, bringt aber nix.
Gruß
Jürgen

Sieben
Beiträge: 294
Registriert: Mo 24. Aug 2020, 14:16
OS, Lazarus, FPC: Ubuntu Xenial 32, Lazarus 2.2.0, FPC 3.2.2
CPU-Target: i386

Re: ZEOS Insert, Update und Delete

Beitrag von Sieben »

Also ich bleibe bei ZConnection Disconnect/Connect das funktioniert wenigstens.
Das ist aber ein sicheres Zeichen dafür, dass in deinem Setup etwas nicht stimmt und dir später auf die Füße fallen wird.

Benutzeravatar
Zvoni
Beiträge: 434
Registriert: Fr 5. Jul 2024, 08:26
OS, Lazarus, FPC: Windoof 10 Pro (Laz 2.2.2 FPC 3.2.2)
CPU-Target: 32Bit
Wohnort: BW

Re: ZEOS Insert, Update und Delete

Beitrag von Zvoni »

Sieben hat geschrieben: Fr 20. Sep 2024, 13:16
Also ich bleibe bei ZConnection Disconnect/Connect das funktioniert wenigstens.
Das ist aber ein sicheres Zeichen dafür, dass in deinem Setup etwas nicht stimmt und dir später auf die Füße fallen wird.
Aber sowas von definitiv sicheres Zeichen
Ein System sie alle zu knechten, ein Code sie alle zu finden,
Eine IDE sie ins Dunkel zu treiben, und an das Framework ewig zu binden,
Im Lande Redmond, wo die Windows drohn.

Benutzeravatar
af0815
Lazarusforum e. V.
Beiträge: 6922
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 Insert, Update und Delete

Beitrag von af0815 »

Zvoni hat geschrieben: Fr 20. Sep 2024, 12:59
af0815 hat geschrieben: Fr 20. Sep 2024, 12:30 Die Queries von ZEOS und SQLdb versuchen die Statement für UPDATE, INSERT und DELETE zu erraten. Das geht öfters nicht (weil z.B. der Primärschlüssel nicht bekannt ist), dann kann die Query halt nur SELECT. Für die anderen Sachen (UPDATE,...) gibt es dann die Möglichkeit eigen Statements zu definieren und dann ist die Query auch in der Lage Einzufügen, Löschen oder Updaten.

Bei SQLdb heissen die Eigenschaften UpdateSQL, InsertSQL und DeleteSQL (und ein UpdateSQL gibt es auch). Bei ZEOS werden die so ähnlich heissen.
Ich finde das dermassen fürchterlich, dass es das gibt.
Entweder ich kann SQL, oder ich kann es nicht.
Na ja, so schlecht sind diese Solver nicht. Ich würde sie nicht verteufeln, weil es funktioniert sowieso nicht, wenn das Umfeld nicht stimmt.

Faustregel: Einen Primärschlüssel der im Select enthalten ist, keine Joins, keine Subselects. Dann wird es meistens erraten. Und damit das überhaupt funktioniert, dann mit aktiven Datenset arbeiten, und nur dort. Dann wird alles automatisch richtig gemacht. Die Funktionen sind genaugenommen für die visuellen Komponenten gedacht. Nur geht es ohne visuelle Komponenten auch.

So wie Juelin es nutzt, muss man alles per Hand machen.
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).

Benutzeravatar
Zvoni
Beiträge: 434
Registriert: Fr 5. Jul 2024, 08:26
OS, Lazarus, FPC: Windoof 10 Pro (Laz 2.2.2 FPC 3.2.2)
CPU-Target: 32Bit
Wohnort: BW

Re: ZEOS Insert, Update und Delete

Beitrag von Zvoni »

af0815 hat geschrieben: Fr 20. Sep 2024, 13:43 Na ja, so schlecht sind diese Solver nicht. Ich würde sie nicht verteufeln, weil es funktioniert sowieso nicht, wenn das Umfeld nicht stimmt.

Faustregel: Einen Primärschlüssel der im Select enthalten ist, keine Joins, keine Subselects. Dann wird es meistens erraten. Und damit das überhaupt funktioniert, dann mit aktiven Datenset arbeiten, und nur dort. Dann wird alles automatisch richtig gemacht. Die Funktionen sind genaugenommen für die visuellen Komponenten gedacht. Nur geht es ohne visuelle Komponenten auch.
Aber genau um das gehts: Im seltensten Fall kommt man um JOINS u.ä. kaum herum, zumindest ich nicht.

Die Queries die ich bei meiner Arbeit mache (Hat jetzt nix mit Lazarus/FPC zu tun), haben bequem mal 20-30 JOIN's aufwärts.

Ein SELECT-Query mit 10-20 CTE's (welche zum Teil selbst JOINS haben), und im äusseren SELECT nochmal mit 20-30 JOIN's sind keine Seltenheit bei mir
Ein System sie alle zu knechten, ein Code sie alle zu finden,
Eine IDE sie ins Dunkel zu treiben, und an das Framework ewig zu binden,
Im Lande Redmond, wo die Windows drohn.

paweld
Beiträge: 99
Registriert: So 11. Jun 2023, 16:01
OS, Lazarus, FPC: Lazarus trunk, FPC fixes

Re: ZEOS Insert, Update und Delete

Beitrag von paweld »

ZQuery verfügt über eine RowsAffected-Funktion, die die Anzahl der geänderten/hinzugefügten Datensätze zurückgibt. Beispiel für den Aufruf:

Code: Alles auswählen

procedure TForm1.Button1Click(Sender: TObject);
begin
  ZQuery1.SQL.Text := 'update table set column0=:col0';
  ZQuery1.ParamByName('col0').AsString := 'test';
  ZQuery1.ExecSQL;
  if ZQuery1.RowsAffected > 0 then
    ShowMessage(Format('%d Zeilen betroffen', [ZQuery1.RowsAffected]))
  else
    ShowMessage('Keine Daten wurden aktualisiert');
end;
Grüße / Pozdrawiam
paweld

Benutzeravatar
juelin
Beiträge: 310
Registriert: Sa 24. Jul 2021, 18:03
OS, Lazarus, FPC: Linux Ubuntu 22. Windows 10 Delphi 11.3 (L 0.9.xy FPC 2.2.z)
CPU-Target: 64Bit
Wohnort: Mannheim

Re: ZEOS Insert, Update und Delete

Beitrag von juelin »

Danke poweld, das war es wonach ich gesucht habe.
Gruß
Jürgen

Benutzeravatar
Zvoni
Beiträge: 434
Registriert: Fr 5. Jul 2024, 08:26
OS, Lazarus, FPC: Windoof 10 Pro (Laz 2.2.2 FPC 3.2.2)
CPU-Target: 32Bit
Wohnort: BW

Re: ZEOS Insert, Update und Delete

Beitrag von Zvoni »

juelin hat geschrieben: Fr 20. Sep 2024, 16:19 Danke poweld, das war es wonach ich gesucht habe.
Gruß
Jürgen
Denk dran: RowsAffected hat keine Aussage über Transaktion erledigt oder nicht
Ein System sie alle zu knechten, ein Code sie alle zu finden,
Eine IDE sie ins Dunkel zu treiben, und an das Framework ewig zu binden,
Im Lande Redmond, wo die Windows drohn.

paweld
Beiträge: 99
Registriert: So 11. Jun 2023, 16:01
OS, Lazarus, FPC: Lazarus trunk, FPC fixes

Re: ZEOS Insert, Update und Delete

Beitrag von paweld »

Zvoni hat geschrieben: Denk dran: RowsAffected hat keine Aussage über Transaktion erledigt oder nicht
Nein, natürlich nicht. Aber ZEOS hat eine Standardeinstellung von "AutoCommit". Wenn Sie also nicht manuell mit der Verwaltung von Transaktionen beginnen, wird alles sofort in der Datenbank gespeichert.
Grüße / Pozdrawiam
paweld

Benutzeravatar
juelin
Beiträge: 310
Registriert: Sa 24. Jul 2021, 18:03
OS, Lazarus, FPC: Linux Ubuntu 22. Windows 10 Delphi 11.3 (L 0.9.xy FPC 2.2.z)
CPU-Target: 64Bit
Wohnort: Mannheim

Re: ZEOS Insert, Update und Delete

Beitrag von juelin »

Hallo poweld,
ich muss Dich nochmal ansprechen.
Bei ZQuery2.RowsAffected kommt immer 0 raus, wenn ich mehrmals den Datensatz mit gleichem Inhalt update.
Beim 1. mal ist größer Null.
Muss man da irgendwas beachten?
Danke und Gruß
Jürgen

Soner
Beiträge: 753
Registriert: Do 27. Sep 2012, 00:07
OS, Lazarus, FPC: Win10Pro-64Bit, Immer letzte Lazarus Release mit SVN-Fixes
CPU-Target: x86_64-win64
Wohnort: Hamburg

Re: ZEOS Insert, Update und Delete

Beitrag von Soner »

Vergiss RowAffected, das ergibt immer 0.
Ich mache das immer so:

Code: Alles auswählen

      try
        ZQuery1.ExecSQL;
      except
        on E: Exception do  begin
          SqlFehlerNachricht:=E.Message;
          SqlFehler:=True;
        end;
      end;
      
      if SqlFehler then begin
        //SQL-Fehler untersuchen.
      end
      else begin
        //normale Programmausführung
      end;     
Man muss auch TZConnection.TransactIsolaltionLevel richtig einstellen, ich nehme immer tiReadCommitted, nach jedem update/insert auch ZQuery1.Refresh aufrufen.
Wenn du TZConnection.TransactIsolaltionLevel nicht richtig einstellst, dann kann der andere User, in deinem Fall PHPMyAdmin, die Änderungen gar nicht sehen, dann denkt man, dass das Programm Fehler macht, aber es macht kein Fehler, man kann nur nicht sehen was es gemacht hat. Wenn du solche "komischen" Sachen hast, dann beende dein Programm, starte PHPMyAdmin neu.

Wenn deine ZQuery2 ganze Zeit aktiv ist, also mit anderen Datensteuerungen wie TDBEdit, TDBGrid verbunden ist, dann verwende für das Bearbeiten TZUpdateSQL. Mit TZUpdateSQL kann man sogar die notwendigen SQLs automatisch erstellen lassen, im Form-Designer rechte Maustaste klicken und "Updatesqleditor ..." auswählen, dann kann man alles einfacher bearbeiten oder löschen, wie:

Code: Alles auswählen

//Bearbeiten oder Hinzufügen
ZQuery2.Edit; // oder ZQuery2.Append für hinzufügen.
ZQuery2.FieldByName('FeldXY').AsString:='xyz';
ZQuery2.FieldByName('FeldXY2').AsDate:=Date; 
//...
ZQuery2.Post;

//Aktuelle Datensatz Löschen:
ZQuery2.Delete;

//wenn man ZQuery2.CachedUpdates true hat, dann muss man noch..
//ZQuery2.ApplyUpdates aufrufen.

Das waren nur Tipps, wahrscheinlich kein richtiger Antwort auf deine Frage.

paweld
Beiträge: 99
Registriert: So 11. Jun 2023, 16:01
OS, Lazarus, FPC: Lazarus trunk, FPC fixes

Re: ZEOS Insert, Update und Delete

Beitrag von paweld »

Soner hat geschrieben: Vergiss RowAffected, das ergibt immer 0.
Von welcher Version von ZEOS sprechen Sie?
Es funktioniert gut mit Version 8, und ich hatte auch in früheren Versionen keine Probleme mit MSSQL.

@Jürgen
Anbei ein Beispiel mit Ihren Daten aus dem Thread „Flightradar 2“

MariaDB führt keine Aktualisierungen durch, wenn das Feld bereits den Wert enthält, den Sie festlegen möchten.
Dateianhänge
rowsaffected.gif
rowsaffected.gif (108.57 KiB) 2377 mal betrachtet
Project1.zip
(3.79 KiB) 80-mal heruntergeladen
Grüße / Pozdrawiam
paweld

Benutzeravatar
juelin
Beiträge: 310
Registriert: Sa 24. Jul 2021, 18:03
OS, Lazarus, FPC: Linux Ubuntu 22. Windows 10 Delphi 11.3 (L 0.9.xy FPC 2.2.z)
CPU-Target: 64Bit
Wohnort: Mannheim

Re: ZEOS Insert, Update und Delete

Beitrag von juelin »

danke für die Unterstützung.
Ich denke ich habe es jetzt.
Ich merke mir den Wert vom Update und solange sich der Wert nicht ändert übergehe ich die Routine Update.
Gruß
Jürgen

Soner
Beiträge: 753
Registriert: Do 27. Sep 2012, 00:07
OS, Lazarus, FPC: Win10Pro-64Bit, Immer letzte Lazarus Release mit SVN-Fixes
CPU-Target: x86_64-win64
Wohnort: Hamburg

Re: ZEOS Insert, Update und Delete

Beitrag von Soner »

paweld hat geschrieben: Sa 21. Sep 2024, 08:49 ...
Von welcher Version von ZEOS sprechen Sie?
..
7.2.4.-stable.

Antworten