Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi SQL INSERT mit ID Rückgabe (https://www.delphipraxis.net/14682-sql-insert-mit-id-rueckgabe.html)

QuickAndDirty 13. Jan 2004 23:27


SQL INSERT mit ID Rückgabe
 
Hallo kann mir jemand einen einfachen Weg
nennen wie ich ein Insert absetzen kann
und die ID(autoinc) des neuen Datensatzes erfahre.

Bis her benötige ich dafür:
1.Ein INSERT mit einer ungewöhnlichen seltenen Zahl in einem Feld.
2.Ein SELECT um diese Zahl zu finden (und die id zu ermitteln)
und
3. ein UPDATE um die restlichen Werte Where ID einzufügen.

Leider ist das etwas unsicher und auch sehr improvisert,
wie geht es richtig?

Leuselator 13. Jan 2004 23:29

Re: SQL INSERT mit ID Rückgabe
 
Willkommen in der Gemeinde :-)

@Thema: welche Datenbank, welche Tabellen?

trifid 13. Jan 2004 23:33

Re: SQL INSERT mit ID Rückgabe
 
Hallo,

normalerweise musst du dich gar nicht um die ID kümmern wenn Du einen INSERT durchführen möchtest.
Deine Reihenfolge
insert - select - update
müsste mit einem
insert realisierbar sein

Anders ist es, wenn ein Datensatz bereits existiert, dann
ermittle ID - insert ... where FeldID = ID

QuickAndDirty 13. Jan 2004 23:48

Re: SQL INSERT mit ID Rückgabe
 
Also, zu frage welche Datenbank:
Ich muss Code Für oracle,mssql,dbisam,paradox datenbanken schreiben.
Das alles muss auch mit globalen Daten funktionieren.


Zu, id sei nicht notwendig bei einem insert:
Ich Arbeite auf einem selbst gebauten nachfahren von TStringGrid
(Die Sourcen von Delphi datenbank-componenten ändern sich immer
so schnell). Beim daten einlesen wird die Herkunft der Daten
jeder Zelle hinterlegt (Tabelle, idfeld, idwert) so das ich
nicht immer alle Felder Anzeigen muss und leicht einzelne
Datensätze ändern und löschen kann.

Füge ich nun etwas ein dann steht es zwar da und ist gespeichert
nur kann ich es nicht ändern oder löschen weil die ID fehlt. :wall:


Weis jemand Rat?

Robert_G 14. Jan 2004 00:05

Re: SQL INSERT mit ID Rückgabe
 
in Oracle klappt das:

Delphi-Quellcode:
  Query1.SQL.Text :=
    'BEGIN' + #10 +
    ' INSERT INTO Tabelle' + #10 +
    '   (Field1, Field2, ...)' + #10 +
    ' VALUES' + #10 +
    '   (1, ''Hallo'', ...)' + #10 +
    ' RETURNING ID' + #10 +
    ' INTO    :oID;' + #10
    'END;';



":oID" muss als output parameter definiert werden und enthält die neue ID.

edit: unkonzentriert :wall:

Leuselator 14. Jan 2004 00:06

Re: SQL INSERT mit ID Rückgabe
 
Also im Einzelplatzbetrieb könnte ein Insert mit anschließendem Select:
select max(id) from Tabelle
funktionieren - ist im Mehrplatzbetrieb aber nicht sicher.
Dort könntest Du das nur mit Triggern hinbekommen.

trifid 14. Jan 2004 08:19

Re: SQL INSERT mit ID Rückgabe
 
@QuickAndDirty
Zitat:

Ich muss Code Für oracle,mssql,dbisam,paradox datenbanken schreiben.
Das alles muss auch mit globalen Daten funktionieren.
also für den professionellen Einsatz.
aber ist das dann nicht
Zitat:

Ich Arbeite auf einem selbst gebauten nachfahren von TStringGrid
quick and dirty :?:

Zitat:

(Die Sourcen von Delphi datenbank-componenten ändern sich immer so schnell).
es gibt so viele Grids von Dritt-Herstellern die sich nicht erlauben können alle 10 Monate die methoden und property zu ändern

Zitat:

Beim daten einlesen wird die Herkunft der Daten
jeder Zelle hinterlegt (Tabelle, idfeld, idwert) so das ich
nicht immer alle Felder Anzeigen muss und leicht einzelne
Datensätze ändern und löschen kann.
OK, dann brauchst Du im DataSet (wenn Du es schon nicht im Grid anzeigen möchtest) Deine ID :!:
da kannst Du dann jederzeit darauf zugreifen ...
RechteMausTaste auf TTable, TADODateSet und dann alle Felder hinzufügen
Zitat:

Füge ich nun etwas ein dann steht es zwar da und ist gespeichert
nur kann ich es nicht ändern oder löschen weil die ID fehlt.
die ID fehlt nicht in der DB, richtig?
sondern nur in Deiner Form, weil das StringGrid diese Info nicht hält

Wegalt 15. Jan 2004 15:57

Re: SQL INSERT mit ID Rückgabe
 
Bei Oracle kannst du dir auch erst eine ID holen und diese dann eintragen. Die ID ist wenn du sie dir holst eindeutig!

Delphi-Quellcode:
'Select SEQUENCENAME.NEXTVAL from DUAL'
und das Ergebnis dann für in deinem Insert einsetzen

Gruß
Wegalt

QuickAndDirty 18. Feb 2004 13:13

Re: SQL INSERT mit ID Rückgabe
 
Hi,
ich habs.
Also das Problem ist für alle Server gelöst:
Mann kann beim Insert die ID mit übergeben.
wenn die schon belegt ist dann gibts ne Exception
und ich incremtiere die ID und versuchs noch einmal.
Damit man nicht ganz unten anfangen muss holt man sich mit
SELECT max(id) FROM bla
einen möglichst hohen Wert und incrementiert ihn zur Wunsch ID.

Da im Netz ein andere Benutzer dazwischen kommen könten und ich
Exception nicht so mag führe ich jetzt so ne Art Journal mit den
Letzen Inserts und IDs für alle Tabellen und User.

Vielen dank für die Tipps

mfg
QuickAndDirty

Leuselator 18. Feb 2004 13:31

Re: SQL INSERT mit ID Rückgabe
 
Bei MS-SQL-Server mußt Du vorher:
SQL-Code:
SET IDENTITY_INSERT [ database. [ owner. ] ] { table } { ON | OFF }
setzen - sonst meckert er beim Versuch, einen Wert in eine Identityspalte einzufügen...
Gruß


Alle Zeitangaben in WEZ +1. Es ist jetzt 19:23 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