AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Datenbanken Delphi Auto-ID des eben eingefügten Datensatzes erhalten
Thema durchsuchen
Ansicht
Themen-Optionen

Auto-ID des eben eingefügten Datensatzes erhalten

Ein Thema von Daniel · begonnen am 13. Nov 2006 · letzter Beitrag vom 14. Nov 2006
Antwort Antwort
Seite 1 von 2  1 2      
Daniel
(Co-Admin)

Registriert seit: 30. Mai 2002
Ort: Hamburg
13.919 Beiträge
 
Delphi 10.4 Sydney
 
#1

Auto-ID des eben eingefügten Datensatzes erhalten

  Alt 13. Nov 2006, 18:14
Datenbank: MySQL • Version: 5.x • Zugriff über: dbExpress
Mohoin,

furchtbar - ich, Delphi und Datenbanken.

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:
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;
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.

Was könnt' ich denn machen, um an die Auto-ID des eben eingefügten Datensatzes zu kommen?
Daniel R. Wolf
mit Grüßen aus Hamburg
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

Registriert seit: 9. Dez 2005
Ort: Heilbronn
39.851 Beiträge
 
Delphi 11 Alexandria
 
#2

Re: Auto-ID des eben eingefügten Datensatzes erhalten

  Alt 13. Nov 2006, 18:40
Ich weiß nicht ob das mit MySQL klappt: select ... into :id;
Markus Kinzler
  Mit Zitat antworten Zitat
Benutzerbild von alcaeus
alcaeus

Registriert seit: 11. Aug 2003
Ort: München
6.537 Beiträge
 
#3

Re: Auto-ID des eben eingefügten Datensatzes erhalten

  Alt 13. Nov 2006, 18:53
Moin,

wenn du folgendes Query ausfuehrst:
SHOW TABLE STATUS LIKE static_docs; 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.

Greetz
alcaeus
Andreas B.
Die Mutter der Dummen ist immer schwanger.
Ein Portal für Informatik-Studenten: www.infler.de
  Mit Zitat antworten Zitat
Hansa

Registriert seit: 9. Jun 2002
Ort: Saarland
7.554 Beiträge
 
Delphi 8 Professional
 
#4

Re: Auto-ID des eben eingefügten Datensatzes erhalten

  Alt 13. Nov 2006, 18:58
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 :

http://www.w3schools.com/sql/sql_select.asp

Verwende eine stored Procedure, da gehts. D.h. allerdings für MySQL : ab V5.0 Alles ohne Gewähr !!
Gruß
Hansa
  Mit Zitat antworten Zitat
Daniel
(Co-Admin)

Registriert seit: 30. Mai 2002
Ort: Hamburg
13.919 Beiträge
 
Delphi 10.4 Sydney
 
#5

Re: Auto-ID des eben eingefügten Datensatzes erhalten

  Alt 13. Nov 2006, 19:24
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.
Daniel R. Wolf
mit Grüßen aus Hamburg
  Mit Zitat antworten Zitat
bttb930

Registriert seit: 6. Okt 2003
372 Beiträge
 
#6

Re: Auto-ID des eben eingefügten Datensatzes erhalten

  Alt 13. Nov 2006, 19:44
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.
  Mit Zitat antworten Zitat
Delami

Registriert seit: 25. Mai 2006
26 Beiträge
 
Delphi 11 Alexandria
 
#7

Re: Auto-ID des eben eingefügten Datensatzes erhalten

  Alt 13. Nov 2006, 19:57
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...
  Mit Zitat antworten Zitat
Igotcha

Registriert seit: 22. Dez 2003
544 Beiträge
 
Delphi 2006 Professional
 
#8

Re: Auto-ID des eben eingefügten Datensatzes erhalten

  Alt 14. Nov 2006, 08:37
MySQL bietet dazu das Statement

Delphi-Quellcode:
ZQuery1.SQL.Text:='INSERT INTO....';
ZQuery1.ExecSQL;

ZQuery1.SQL.Text:='SELECT LAST_INSERT_ID()';
ZQuery1.Open;
myData.FID:=ZQuery1.Fields[0].AsInteger;
Ist connectiongebunden und somit für die jeweilige Aktion auch immer eindeutig - sprich, es kann dir bzgl. der ID keiner dazwischenfunken.

Gruß Igotcha
  Mit Zitat antworten Zitat
Daniel
(Co-Admin)

Registriert seit: 30. Mai 2002
Ort: Hamburg
13.919 Beiträge
 
Delphi 10.4 Sydney
 
#9

Re: Auto-ID des eben eingefügten Datensatzes erhalten

  Alt 14. Nov 2006, 09:23
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.
Daniel R. Wolf
mit Grüßen aus Hamburg
  Mit Zitat antworten Zitat
alzaimar
(Moderator)

Registriert seit: 6. Mai 2005
Ort: Berlin
4.956 Beiträge
 
Delphi 2007 Enterprise
 
#10

Re: Auto-ID des eben eingefügten Datensatzes erhalten

  Alt 14. Nov 2006, 10:48
Zitat von Delami:
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...
Das ist aber ziemlich ineffizient.

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.
"Wenn ist das Nunstruck git und Slotermeyer? Ja! Beiherhund das Oder die Flipperwaldt gersput!"
(Monty Python "Joke Warefare")
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


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 +1. Es ist jetzt 06:47 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz