![]() |
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?? |
Re: id vom letzten insert
Gibts keine Property "LastAutoIncVal"? Oder funktioniert vlt. "SELECT LAST_INSERT_ID() FROM Tabelle"?
|
Re: id vom letzten insert
und wie bekomme ich dann den query rückgabewert in die var lastid??
|
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])); |
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! |
Re: id vom letzten insert
Na dann weis es einer Variablen zu.
|
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:
Aufgerufen wird die Funktion wie folgt:
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
Delphi-Quellcode:
var lastId:Integer;
... ... lastId:=GetLastInsertID(ADOQuery1); |
Re: id vom letzten insert
geht es nicht irgendwie anders also mit dieser funktion??
Delphi-Quellcode:
und jetzt einfach das was rauskommt in eine variable! aber wie??
Qry.Close;
Qry.SQL.Text:='SELECT LAST_INSERT_ID()'; Qry.Open; |
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. |
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. |
Re: id vom letzten insert
Bei Oracle gibt es "Returning"
![]() Aber es geht hier ja nicht um Oracle. Sherlock |
Re: id vom letzten insert
Zitat:
Zitat:
|
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!
|
Re: id vom letzten insert
Hast Du denn gelesen was die anderen und die Hilfe von mySQL zu dem Thema sagen?
|
Re: id vom letzten insert
Anscheinend nicht :roll:
Also nochmal mit Hervorhebung: Zitat:
|
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. |
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 ;) |
Re: id vom letzten insert
Gut, aber auch da interessiert dem Entwickler nicht der konkrete Wert der IDs.
|
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 |
Re: id vom letzten insert
Zitat:
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 |
Re: id vom letzten insert
Zitat:
|
Re: id vom letzten insert
Zitat:
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. |
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! |
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:
in eine variable geschrieben werden kann??
Qry.Close;
Qry.SQL.Text:='SELECT LAST_INSERT_ID()'; Qry.Open; |
Re: id vom letzten insert
Zitat:
![]() |
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; |
Re: id vom letzten insert
Zitat:
|
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:
so stelle ich mir das vor! Also im Zweiten Teil Code habe ich jetzt die Variablen weggelassen..
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); 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?? |
Re: id vom letzten insert
Zitat:
|
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?? |
Re: id vom letzten insert
Nein, muss sie nicht. Die DB weiß nichts von Delphi Bezeichnern !
|
Re: id vom letzten insert
Zitat:
Zitat:
Das sind nun aber wirklich absolute Grundlagen. |
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