Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi id vom letzten insert (https://www.delphipraxis.net/127627-id-vom-letzten-insert.html)

Delphi-Phil 16. Jan 2009 09:52

Datenbank: mysql • Zugriff über: ado

id vom letzten insert
 
Hallo Zusammen und einen guten Morgen,

wie kann ich nach einem inster mit einer ado query die id von dem eingefügten datensatz rausfinden und sie in eine var schreiben??

nuclearping 16. Jan 2009 09:54

Re: id vom letzten insert
 
Gibts keine Property "LastAutoIncVal"? Oder funktioniert vlt. "SELECT LAST_INSERT_ID() FROM Tabelle"?

Delphi-Phil 16. Jan 2009 10:02

Re: id vom letzten insert
 
und wie bekomme ich dann den query rückgabewert in die var lastid??

Gollum 16. Jan 2009 10:04

Re: id vom letzten insert
 
Hallo,

nuclearping hat Dir fast die korrekte Antwort gegeben.

Nach dem Einfügen eines neuen Datensatzes musst Du folgendes tun:
Delphi-Quellcode:
ADOQuery1.Close;
ADOQuery1.SQL.Text:='SELECT LAST_INSERT_ID()';
ADOQuery1.Open;
ShowMessage(Format('Letzte eingefügte ID: %d', [ADOQuery1.Fields[0].AsInteger]));

Delphi-Phil 16. Jan 2009 10:20

Re: id vom letzten insert
 
so geht es jetzt! Danke!

jetzt lässt du es aber in einer Message anzeigen ich brauche es aber in einer Variable!

Luckie 16. Jan 2009 10:25

Re: id vom letzten insert
 
Na dann weis es einer Variablen zu.

Gollum 16. Jan 2009 10:25

Re: id vom letzten insert
 
Hallo,

wo ist jetzt das Problem? Ich denke Du willst programmieren? Ein bisschen Abstraktion gehört nun mal zum Geschäft.

Delphi-Quellcode:
function GetLastInsertID(aQry:TADOQuery):Integer;
begin
  with aQry do
  begin
    Close();
    SQL.Text:='SELECT LAST_INSERT_ID()';
    Open();
    Result:=Fields[0].AsInteger;
  end; // with aQry
end; // LastInsertID
Aufgerufen wird die Funktion wie folgt:
Delphi-Quellcode:
var lastId:Integer;
...
...
lastId:=GetLastInsertID(ADOQuery1);

Delphi-Phil 16. Jan 2009 10:56

Re: id vom letzten insert
 
geht es nicht irgendwie anders also mit dieser funktion??

Delphi-Quellcode:
Qry.Close;
Qry.SQL.Text:='SELECT LAST_INSERT_ID()';
Qry.Open;
und jetzt einfach das was rauskommt in eine variable! aber wie??

Gollum 16. Jan 2009 11:00

Re: id vom letzten insert
 
Hallo,

kannst Du nicht lesen?
Ich habe Dir doch die Lösung in meinem (vor)letzten Eintrag als fertige Funktion gepostet.

QuickAndDirty 16. Jan 2009 11:11

Re: id vom letzten insert
 
Sicher das das geht?

Wenn
1. 2 User nahezu gleichzeitig einen Datensatz einfügen.
2. Einfügen beider Datensätze beendet ist.
3. Und dann beide lastID Abfragen

bekommen dann beide den von ihnen selbst eingefügt Datensatz???
Ich bezweifle das etwas.
Es sei denn macht das Einfügen und das LastID in einer Transaction.

In oracle gibts ne Lösung für das Problem.(So habe ich mir das mal erzählen lassen)
Man kann dort einen "Token" hohlen dieser ist dann reserviert
Wenn jetzt ein anderer User einfügt passiert das quasi auf der ID nach dem Token.
Ich kann dann auf den so eben geholten "Token"(ist wohl der ID wert) einfügen und
auch in weiteren SQLs auf den von mir eingefügten Datensatz über den Token bezug
nehmen.

Sherlock 16. Jan 2009 11:18

Re: id vom letzten insert
 
Bei Oracle gibt es "Returning" http://de.wikibooks.org/wiki/Oracle:_Sequenzen

Aber es geht hier ja nicht um Oracle.

Sherlock

jfheins 16. Jan 2009 11:23

Re: id vom letzten insert
 
Zitat:

Zitat von QuickAndDirty
Sicher das das geht?

...

Im MySQL-Manual heißt es dazu:
Zitat:

For LAST_INSERT_ID(), the most recently generated ID is maintained in the server on a per-connection basis. It is not changed by another client. It is not even changed if you update another AUTO_INCREMENT column with a non-magic value (that is, a value that is not NULL and not 0). Using LAST_INSERT_ID() and AUTO_INCREMENT columns simultaneously from multiple clients is perfectly valid. Each client will receive the last inserted ID for the last statement that client executed.
;)

Delphi-Phil 16. Jan 2009 11:44

Re: id vom letzten insert
 
hießt das jetzt für mich, es ist möglich die letzte id zu bekommen oder nicht??? So das ich auch wirlich die id von dem eingefügten datensatz bekomme und nicht wenn dazwischen ein anderer user war!

Sharky 16. Jan 2009 11:45

Re: id vom letzten insert
 
Hast Du denn gelesen was die anderen und die Hilfe von mySQL zu dem Thema sagen?

jfheins 16. Jan 2009 11:47

Re: id vom letzten insert
 
Anscheinend nicht :roll:

Also nochmal mit Hervorhebung:
Zitat:

For LAST_INSERT_ID(), the most recently generated ID is maintained in the server on a per-connection basis. It is not changed by another client. It is not even changed if you update another AUTO_INCREMENT column with a non-magic value (that is, a value that is not NULL and not 0). Using LAST_INSERT_ID() and AUTO_INCREMENT columns simultaneously from multiple clients is perfectly valid. Each client will receive the last inserted ID for the last statement that client executed.

Luckie 16. Jan 2009 11:49

Re: id vom letzten insert
 
Was will ich mit der eigentlich anfangen? Die ist doch nur für das DBMs interessant, um einen Datrensatz eindeutig identifizieren zu können. Für den Entwickler ist oder sollte sie ohne Bedeutung sein. Wenn ich Datensätze lösche und anschliessend die Datenbank komprimiere (also das die Datensätze tatsächlich gesclöscht werden) und dann der Datenbank sage, sie soll die Index neu vergeben (warum auch immer) sind meine Referenzen per ID kaputt.

Eine ID dient nur der Datenbank für die interne Verwaltung der Datensätze.

jfheins 16. Jan 2009 11:57

Re: id vom letzten insert
 
Wenn ich aber z.B. eine 1:n Beziehung modelliere, dann nehme ich eine Tabelle für die einen Datensätzte und eine andere für die anderen Daten und in der einen Tabelle gibt es dann eine Spalte für den Index der anderen.

z.B. Buch>Seiten - da hat dann jede Seite die ID des Buches, zu dem es gehört.

Diese ID's dann neu durchzunummerieren ohne die Seiten upzudaten gehört verboten ;)

Luckie 16. Jan 2009 11:58

Re: id vom letzten insert
 
Gut, aber auch da interessiert dem Entwickler nicht der konkrete Wert der IDs.

Delphi-Phil 16. Jan 2009 12:01

Re: id vom letzten insert
 
ich habe eine tabelle klassen da lege ich einen datensatz an(also eine klasse)

dann habe ich eine tabelle jahrgaenge da lege ich auch einen datensatz an

und dann habe ich eine tabelle klassen_jahrgaenge

da lege ich einen datensatz an der aus der id besteht von dem angelegten datensatz in klassen und von dem angelegten datensatz in jahrgaengen

jfheins 16. Jan 2009 12:01

Re: id vom letzten insert
 
Zitat:

Zitat von Luckie
Gut, aber auch da interessiert dem Entwickler nicht der konkrete Wert der IDs.

Später nicht mehr, aber zum einfügen schon:

Wenn ich ein neues Buch hinzufüge, erstelle ich z.B. erst einen Buch-eintrag und dann die Seiten. Dazu muss ich aber die ID des Buches wissen. Und dafür benutze ich dann die Funktion mysql_last_insert_id() ;)

Also Buch einfügen :arrow: ID herausfinden :arrow: Seite mit dieser ID einfügen

Delphi-Phil 16. Jan 2009 12:23

Re: id vom letzten insert
 
Zitat:

ich habe eine tabelle klassen da lege ich einen datensatz an(also eine klasse)

dann habe ich eine tabelle jahrgaenge da lege ich auch einen datensatz an

und dann habe ich eine tabelle klassen_jahrgaenge

da lege ich einen datensatz an der aus der id besteht von dem angelegten datensatz in klassen und von dem angelegten datensatz in jahrgaengen
was soll ich denn jetzt tun??

nuclearping 16. Jan 2009 12:28

Re: id vom letzten insert
 
Zitat:

Zitat von Delphi-Phil
was soll ich denn jetzt tun??

Ähh ... Grundlagen aneignen?

Oder wenn du schon was gemacht hast und da konkret ein Problem hast, dazu halt deine Frage stellen.

Aber so wie's da jetzt steht, klingts ja fast so, als ob du fast erwartest, dass dir jemand die verschiedenen Lösungsmöglichkeiten buchstabiert.

QuickAndDirty 16. Jan 2009 12:32

Re: id vom letzten insert
 
Mit MySQL scheint es ja recht einfach zu sein und wurde ja auch schon genannt wie es geht.

Finde ich super das es dort eine Sitzungs abhängige Last ID gibt. Daumen hoch!

Delphi-Phil 16. Jan 2009 12:33

Re: id vom letzten insert
 
nein verschiedene lösungen möchte ich hier natürlich nicht buchstabiert bekommen...

ich möchte nur wissen, wie das ergebnis, was hier geliefert wird :

Delphi-Quellcode:
Qry.Close;
Qry.SQL.Text:='SELECT LAST_INSERT_ID()';
Qry.Open;
in eine variable geschrieben werden kann??

rwachtel 16. Jan 2009 12:36

Re: id vom letzten insert
 
Zitat:

Zitat von Delphi-Phil
[...] ich möchte nur wissen, wie das ergebnis, was hier geliefert wird [...] in eine variable geschrieben werden kann??

http://www.delphipraxis.net/internal...=989224#989224

Delphi-Phil 16. Jan 2009 12:47

Re: id vom letzten insert
 
die funktion ist ja schön und sie geht warscheinlich auch aber wie baue ich die in meinen code ein???

Delphi-Quellcode:
Qry := TADOQuery.Create(self);
Qry.Connection := HauptForm.ADOConnection1;
Qry.SQL.Text := 'insert into klassen (Klassenname, Stufe, Jahrgang, Jahr1, Jahr2 ) values (:KlassennameNeu, :StufeNeu, :JahrgangNeu, :Jahr1Neu, :Jahr2Neu )';
Qry.Parameters.ParamByName('KlassennameNeu').Value := KlassennameNeu;
Qry.Parameters.ParamByName('StufeNeu').Value := StufeNeu;
Qry.Parameters.ParamByName('JahrgangNeu').Value := JahrgangNeu;
Qry.Parameters.ParamByName('Jahr1Neu').Value := Jahr1Neu;
Qry.Parameters.ParamByName('Jahr2Neu').Value := Jahr2Neu;
Qry.ExecSQL;

rwachtel 16. Jan 2009 13:06

Re: id vom letzten insert
 
Zitat:

Zitat von Delphi-Phil
die funktion ist ja schön und sie geht warscheinlich auch aber wie baue ich die in meinen code ein??? [...]

Diese Frage meinst Du jetzt nicht wirklich ernst, oder??? :gruebel:

Delphi-Phil 16. Jan 2009 13:22

Re: id vom letzten insert
 
Delphi-Quellcode:
function GetLastInsertID(Qry:TADOQuery):Integer;
begin
  with Qry do
  begin
    Close();
    SQL.Text:='SELECT LAST_INSERT_ID()';
    Open();
    Result:=Fields[0].AsInteger;
  end; // with Qry
  end;


Delphi-Quellcode:
Qry := TADOQuery.Create(self);
Qry.Connection := HauptForm.ADOConnection1;
Qry.SQL.Text := 'insert into klassen (Klassenname, Stufe, Jahrgang, Jahr1, Jahr2 ) values (:KlassennameNeu, :StufeNeu, :JahrgangNeu, :Jahr1Neu, :Jahr2Neu )';
Qry.Parameters.ParamByName('KlassennameNeu').Value := KlassennameNeu;
Qry.Parameters.ParamByName('StufeNeu').Value := StufeNeu;
Qry.Parameters.ParamByName('JahrgangNeu').Value := JahrgangNeu;
Qry.Parameters.ParamByName('Jahr1Neu').Value := Jahr1Neu;
Qry.Parameters.ParamByName('Jahr2Neu').Value := Jahr2Neu;
Qry.ExecSQL;

KIDNeu := GetLastInsertID(Qry);
so stelle ich mir das vor! Also im Zweiten Teil Code habe ich jetzt die Variablen weggelassen..

Nur meine Frage ist nur wie ist das mit den Querys läuft in der Funktion wird ja eine zur Laufzeit erzeugt, muss du genau so heißen wie die in der procedure die erzeugt wird oder wie läuft da??

rwachtel 16. Jan 2009 13:26

Re: id vom letzten insert
 
Zitat:

Zitat von Delphi-Phil
[...] Nur meine Frage ist nur wie ist das mit den Querys läuft in der Funktion wird ja eine zur Laufzeit erzeugt, muss du genau so heißen wie die in der procedure die erzeugt wird oder wie läuft da??

Sorry, aber kannst Du das nochmal verständlich formulieren?

Delphi-Phil 16. Jan 2009 13:31

Re: id vom letzten insert
 
tut mir leid was ich da für einen müll geschrieben habe;)

ich meine folgendes:

Die Query mit der ich den Datensatz einfüge in die Tabelle heißt ja Qry muss die Query dann in der Funktion um die ID zu ermitteln auch so heißen??

Hansa 16. Jan 2009 13:34

Re: id vom letzten insert
 
Nein, muss sie nicht. Die DB weiß nichts von Delphi Bezeichnern !

rwachtel 16. Jan 2009 13:35

Re: id vom letzten insert
 
Zitat:

Zitat von Delphi-Phil
[...] Die Query mit der ich den Datensatz einfüge in die Tabelle heißt ja Qry [...]

Nein. Die Variable, die eine Instanz einer Query-Klasse repräsentiert, hast Du Qry genannt.

Zitat:

muss die Query dann in der Funktion um die ID zu ermitteln auch so heißen??
Nein.

Das sind nun aber wirklich absolute Grundlagen.

hitzi 16. Jan 2009 13:40

Re: id vom letzten insert
 
Die Querry muss nur die gleiche Connection nutzen, ansonsten ist es eine andere Session und bekommt den falschen "LastIndex".


Alle Zeitangaben in WEZ +1. Es ist jetzt 01:07 Uhr.

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