AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Datenbanken Delphi Wie kommt man an die ID des eingefügten Eintrages

Wie kommt man an die ID des eingefügten Eintrages

Ein Thema von kagi3624 · begonnen am 29. Jul 2021 · letzter Beitrag vom 31. Jul 2021
Antwort Antwort
Seite 2 von 3     12 3   
kagi3624

Registriert seit: 3. Feb 2020
124 Beiträge
 
Delphi 6 Enterprise
 
#11

AW: Wie kommt man an die ID des eingefügten Eintrages

  Alt 29. Jul 2021, 12:30
Versuch mal
aQuery.Open; statt
aQuery.ExecSQL;
THX! Hat funktioniert!

Gibt es das unter ZEOS auch? Ich kenne es so nur bei FireDAC.
Zumindest bei meiner Komponente ging es nicht.

Geändert von kagi3624 (29. Jul 2021 um 12:33 Uhr)
  Mit Zitat antworten Zitat
generic

Registriert seit: 24. Mär 2004
Ort: bei Hannover
2.375 Beiträge
 
Delphi XE5 Professional
 
#12

AW: Wie kommt man an die ID des eingefügten Eintrages

  Alt 29. Jul 2021, 14:39
Insert Befehle können mehrere Zeilen anlegen und Trigger dann noch mehr.
Es ist immer dann interessant, wenn LAST_INSERT_ID zum Einsatz kommt.
Zum einen wir ja nur eine ID zurück geliefert, auch wenn mehrere Datensätze eingetragen worden sind,
Zum anderen welche ID die vom Hauptdatensatz oder ggf. die letzte ID welche ein Trigger angelegt hat.

Viele SQLs sind um OUTPUT erweitert worden, so dass ein INSERT auch eine Tabelle zurück geben kann.

In PG wird das mit "RETURNING" erreicht:
https://www.postgresql.org/docs/9.5/sql-insert.html
Coding BOTT - Video Tutorials rund um das Programmieren - https://www.youtube.com/channel/UCUG...aXLclwO9qA-lzA
  Mit Zitat antworten Zitat
Sinspin

Registriert seit: 15. Sep 2008
Ort: Dubai
202 Beiträge
 
Delphi 10.3 Rio
 
#13

AW: Wie kommt man an die ID des eingefügten Eintrages

  Alt 29. Jul 2021, 20:02
Im Regelfall sollte man sein Insert doch so gestalten können das man danach mit einem Select in der Lage ist seinen Datensatz zu finden.
Zudem kennt man seine DB ja wohl so weit das man weis was beim Insert läuft und wieviele Datensätze erzeugt werden.
LastAutoInc ist zum Beispiel auch in FireDac nicht für alle DB implementiert die angesprochen werden können.
Stefan
Wir zerstören die Natur und Wälder der Erde. Wir töten wilde Tiere für Trophäen. Wir produzieren Lebewesen als Massenware um sie nach wenigen Monaten zu töten. Jetzt rächt sich die Natur und tötet uns.
  Mit Zitat antworten Zitat
Rollo62

Registriert seit: 15. Mär 2007
3.212 Beiträge
 
Delphi 10.4 Sydney
 
#14

AW: Wie kommt man an die ID des eingefügten Eintrages

  Alt 30. Jul 2021, 08:17
... das man danach mit einem Select ... LastAutoInc ...
Wenn das in einem 2-schrittigen Prozess, von aussen, gemacht wird,
dann könnte ja in der (Millisekunde) Zwischenzeit Jemand anderes einen neuen Record angelegt haben.
Dann stimmt dein LastAutoInc oder LastRecord nicht mehr.
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.270 Beiträge
 
Delphi 11 Alexandria
 
#15

AW: Wie kommt man an die ID des eingefügten Eintrages

  Alt 30. Jul 2021, 08:34
Zumindest MySQL gibt bei last_insert_id() die ID des letzten Datensatzes zurück, der in der aktuellen Verbindung angelegt wurde. In DBMS, die keine Möglichkeit einer RETURNING-Klausel bieten, muss das auch gewährleistet sein, sonst kann man sie ja faktisch nicht gebrauchen.
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
hstreicher

Registriert seit: 21. Nov 2009
218 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#16

AW: Wie kommt man an die ID des eingefügten Eintrages

  Alt 30. Jul 2021, 12:32
Das RETURNING liefert doch ein Ergebnis, genau wie eine SELECT-Query. Bekommst du da nichts zurück?
Code:
i := zQuery.FieldByName('ID').AsInteger;
Hier wird mir aber gesagt, dass so ein Feld nicht existiert nach dem ausführen des Statements.

ja , es wird ja kein Select ausgeführt also keine Ergebnisswerte zum Abfragen geöffnet

bei IbDac UniDac geht das So
Ii := zQuery.ParambyName('RET_ID').AsInteger;

das "RET_" wird von IBDac hinzugefügt
  Mit Zitat antworten Zitat
Sinspin

Registriert seit: 15. Sep 2008
Ort: Dubai
202 Beiträge
 
Delphi 10.3 Rio
 
#17

AW: Wie kommt man an die ID des eingefügten Eintrages

  Alt 30. Jul 2021, 14:38
Wenn das in einem 2-schrittigen Prozess, von aussen, gemacht wird,
dann könnte ja in der (Millisekunde) Zwischenzeit Jemand anderes einen neuen Record angelegt haben.
Dann stimmt dein LastAutoInc oder LastRecord nicht mehr.
Sorry. Das ist quatsch.
"von außen machen" : von außerhalb der Transaktion in der man gerade arbeitet wäre es wohl ein bisschen seltsam nach einem autoinc zu fragen.
"LastAutoInc" : ist bei allen DB mit denen ich zu tuen habe Session bezogen, oder kann Session/Active query bezogen abgefragt werden. Bei MSSQL gibt es dafür @@IDENTITY. Was andere DB dafür bereitstellen weis ich nicht. Aber vermutlich ähnliche Lösungen.
Stefan
Wir zerstören die Natur und Wälder der Erde. Wir töten wilde Tiere für Trophäen. Wir produzieren Lebewesen als Massenware um sie nach wenigen Monaten zu töten. Jetzt rächt sich die Natur und tötet uns.
  Mit Zitat antworten Zitat
Rollo62

Registriert seit: 15. Mär 2007
3.212 Beiträge
 
Delphi 10.4 Sydney
 
#18

AW: Wie kommt man an die ID des eingefügten Eintrages

  Alt 30. Jul 2021, 15:39
Wenn das in einem 2-schrittigen Prozess, von aussen, gemacht wird,
dann könnte ja in der (Millisekunde) Zwischenzeit Jemand anderes einen neuen Record angelegt haben.
Dann stimmt dein LastAutoInc oder LastRecord nicht mehr.
Sorry. Das ist quatsch.
Gut zu wissen, es hörte sich für mich so an als ob das Jemand vorhätte
  Mit Zitat antworten Zitat
Sinspin

Registriert seit: 15. Sep 2008
Ort: Dubai
202 Beiträge
 
Delphi 10.3 Rio
 
#19

AW: Wie kommt man an die ID des eingefügten Eintrages

  Alt 30. Jul 2021, 15:55
Von außen wird das nix. Es sei denn, man kann sich ganz sicher sein das man den Record auch ohne AutoIncwert noch indentifizieren kann.
Zum Beispiel indem man beim Insert eine GUID in den neuen Record schreibt. Die ist ja (fast) Weltweit eindeutig. Geht also zum identifizieren. Allerdings ist son Ding ne ganz schöne Kanone.
Eine Id für den Nutzer plus eine selber hochgezählte Zahl tut es auch. Es gibt zig Möglichkeiten, man muss nur wollen
Stefan
Wir zerstören die Natur und Wälder der Erde. Wir töten wilde Tiere für Trophäen. Wir produzieren Lebewesen als Massenware um sie nach wenigen Monaten zu töten. Jetzt rächt sich die Natur und tötet uns.
  Mit Zitat antworten Zitat
Delphi.Narium

Registriert seit: 27. Nov 2017
1.843 Beiträge
 
Delphi 7 Professional
 
#20

AW: Wie kommt man an die ID des eingefügten Eintrages

  Alt 30. Jul 2021, 16:17
Zeos kennt auch auch noch TZSequence.

Der Komponente weist man die zu nutzende Datenbanksequenz zu.

Vor dem Insert holt man sich dort den nächsten Wert für die ID und übergibt den dann im Insert mit, so dass die Datenbank nicht die ID vergeben muss und man dann auf die Suche gehen muss, welche ID denn da wohl der eingefügte Satz bekommen haben könnte.

Sind in einem ExecSQL mehrere Inserts enthalten, holt man sich entsprechend viele Wert von der TZSequence und weist die dann in den Insertstatements entsprechend zu (Parameter).

Damit hat man dann weder ein Problem beim Ermitteln der ID für jeden der Datensätze, noch kann jemand anderes "quasi von außerhalb der eigenen Transaktion" die Sequenz für andere Aufgaben weiterzählen, so dass man beim Lesen des letzten Wertes der Sequenz dann ggfls. was falsches bekommen könnte (oder sowasinderart).

Für viele Inserts in einem ExecSQL setzt man bei TZSequence BlockSize auf die Anzahl der Inserts und holt dann den nächsten Wert. Damit sind dann dieser Wert plus die nächsten BlockSize - 1 Werte für einen reserviert und für andere nicht mehr vergebbar. Für z. B. 50 Inserts muss man also die Sequenz nicht 50 mal abfragen, sondern nur einmal mit BlockSize 50 und hat damit die nächsten 50 Ids in aufsteigender Folge für sich reserviert.
  Mit Zitat antworten Zitat
Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +2. Es ist jetzt 21:27 Uhr.
Powered by vBulletin® Copyright ©2000 - 2021, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2021 by Daniel R. Wolf