![]() |
Datenbank: MySQL • Version: 5.x • Zugriff über: dbExpress
Auto-ID des eben eingefügten Datensatzes erhalten
Mohoin,
furchtbar - ich, Delphi und Datenbanken. :roll: Also: Ich versuche, aus einer Delphi-Anwendung heraus Daten in eine Datenbank zu schreiben. Mittels einer TSQLConnection verbinde ich mich auf den (lokalen) MySQL-Server und mittels einer TSQLQuery haue ich die Daten rein. Das geht auch ganz reizend:
Delphi-Quellcode:
Jeder Datensatz dieser Tabelle bekommt von der Datenbank eine ID, die mittels Auto-Increment zugewiesen wird. Auch das geht - aber genau diese ID brauche ich in der weiteren Verarbeitung meiner Delphi-Anwendung. In der Hilfe zu TSQLQuery kommt das unschöne Wort "unidirektional" vor, was mir suggeriert, das der von mir gewählte Ansatz hierfür nicht geeignet ist.
with SQLQuery1 do
begin SQL.Text:= 'insert into static_docs (`title`, `docpath`, `key`, `namespace`, `type`, `prgLang`, `natLang`, `text` ) ' + 'values(:title, :docpath, :key, :namespace, :type, :prgLang, :natLang, :text );'; Params.ParamByName('title').AsString:= metaData.title; Params.ParamByName('docpath').AsString:= metaData.docpath; Params.ParamByName('key').AsString:= metaData.itmKey; Params.ParamByName('namespace').AsString:= metaData.itmNamespace; Params.ParamByName('type').AsInteger:= Integer( metaData.itmType ); Params.ParamByName('prgLang').AsInteger:= Integer( metaData.prgLanguage ); Params.ParamByName('natLang').AsInteger:= Integer( metaData.natLanguage ); Params.ParamByName('text').LoadFromStream(memDest, ftBlob); ExecSQL; end; Was könnt' ich denn machen, um an die Auto-ID des eben eingefügten Datensatzes zu kommen? :cry: |
Re: Auto-ID des eben eingefügten Datensatzes erhalten
Ich weiß nicht ob das mit MySQL klappt:
SQL-Code:
select ... into :id;
|
Re: Auto-ID des eben eingefügten Datensatzes erhalten
Moin,
wenn du folgendes Query ausfuehrst:
SQL-Code:
erhaelst du unter anderem die naechste autoinc-ID zurueck (Feld "Auto_increment"). Wenn du von dem Wert 1 abzaehlst, solltest du die naechste ID kriegen. Soweit ich weiss werden die autoinc-IDs immer fortlaufend vergeben; evtl. freigewordene IDs bleiben frei. Du solltest die Tabelle allerdings in einen Lock-State setzen, damit niemand reinpfuschen kann, und wenn du was anderes als MyISAM oder InnoDB als Tabellen-Typ verwendest, funktioniert diese Loesung auch nicht.
SHOW TABLE STATUS LIKE static_docs;
Greetz alcaeus |
Re: Auto-ID des eben eingefügten Datensatzes erhalten
Weiß nicht, was jetzt genau SQLquery1 darstellt. Ist es ein DataSet, dann kriegt man zwar eine Datenmenge zurück, aber keinen Output-Parameter. Kleiner, aber feiner Unterschied. Syntax siehe hier :
![]() Verwende eine stored Procedure, da gehts. D.h. allerdings für MySQL : ab V5.0 Alles ohne Gewähr !! |
Re: Auto-ID des eben eingefügten Datensatzes erhalten
Danke Euch.
Ich sehe schon, ich sollte mich mal ernsthaft mit dem Thema "Datenbanken" befassen. Die SQL-Seite ist nicht das Problem, die Ansteuerung von Delphi aus ist es, die mir Kopfzerbrechen bereitet. |
Re: Auto-ID des eben eingefügten Datensatzes erhalten
Moin,
wenn Du's nicht per INSERT INTO einbfügst, sondern per TADOTable oder TADOQuery, dann kannst Du an das Table bzw. die Query (SELECT * FROM MyTable) mit Add einen Datensatz anfügen. Danach setzt DFu alle Felder und machst dann Post. Jetzt sind die Daten gespeichert. Anschließend (nach dem Post) kannst Du auf die ID zugreifen - soweit ich weiß ist sie jetzt gesetzt. Probier es sicherheitshalber aber noch aus. |
Re: Auto-ID des eben eingefügten Datensatzes erhalten
Ich finde das mit den AutoID auch immer ein elendes Gefummel, und letztlich benutze ich dann das, was immer geht. Ich erzeuge einen neuen Datensatz der z.B. als Nachnamen '999999' enthält. Mit 'select * from meineTabelle where NachName='999999''. Jetzt habe ich die ID und kann NachName neu vergeben. Nicht elegant aber geht... :gruebel:
|
Re: Auto-ID des eben eingefügten Datensatzes erhalten
MySQL bietet dazu das Statement
Delphi-Quellcode:
Ist connectiongebunden und somit für die jeweilige Aktion auch immer eindeutig - sprich, es kann dir bzgl. der ID keiner dazwischenfunken.
ZQuery1.SQL.Text:='INSERT INTO....';
ZQuery1.ExecSQL; ZQuery1.SQL.Text:='SELECT LAST_INSERT_ID()'; ZQuery1.Open; myData.FID:=ZQuery1.Fields[0].AsInteger; Gruß Igotcha |
Re: Auto-ID des eben eingefügten Datensatzes erhalten
Heißen Dank. :-) Das werde ich heute Abend gleich mal ausprobieren. In meinem Fall bin ich so oder so der einzige, der auf der DB herumfummelt.
|
Re: Auto-ID des eben eingefügten Datensatzes erhalten
Zitat:
Wenn man z.B. eine anwendung entwickelt, die (einigermaßen) DB-unabhängig sein soll, dann muss mein seine Zähler selbst verwalten: Eine Tabelle ('TableID') enthält zwei Spalten: (TabellenName, NextID). Dort steht für jede Tabelle die nächste zu vergebende ID drin. Wenn ein neuer Datensatz erzeugt wird, kapsle ich das in einer Transaktion: Erst den Wert aus der TableID-Tabelle holen, den entsprechendend Record um 1 erhöhen und dann die ID in meine Zieltabelle eintragen. Vorteil: Plattformunabhängig. Nachteil: Etwas lahm Wie das nunmal so ist. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 10:27 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 by Thomas Breitkreuz