Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi Datensatz ID herausfinden (https://www.delphipraxis.net/145752-datensatz-id-herausfinden.html)

alleinherrscher 7. Jan 2010 20:28

Datenbank: Firebird • Version: 2.1 • Zugriff über: fibplus

Datensatz ID herausfinden
 
Hi@all!

Ich, als Datenbankneuling, muss leider nochmals eure Hilfe in Anspruch nehmen.

Ich habe in einer Datenbank eine Tabelle angelegt, welche einen Primary Key (B_ID) hat, der automatisch beim Anlegen eines neuen Datensatzes inkrementiert wird.

Das Abspeichern der Daten in der Datenbank erfolgt problemlos und B_ID wird von Firebird auch hochgezählt.
Aber wie kann ich nach dem abspreichern der Daten herausfinden, welche B_ID mein neuer Datensatz bekommen hat?

Der Befehl

DataSetB_ID.AsInteger liefert mir immer 0 zurück.

Jemand eine Ahnung, oder soll ich was Code anhängen?

Vielen Dank, euer Michael

s.h.a.r.k 7. Jan 2010 20:31

Re: Datensatz ID herausfinden
 
Du musst entweder die ID nochmals via SELECT laden oder du schaust in der Dokumentation nach, ob es dort, wie in Oracle einen Returning-Befehl gibt.

Edit: Scheinbar gibt es diesen: siehe hier

hoika 8. Jan 2010 07:37

Re: Datensatz ID herausfinden
 
Hallo,

schau dir mal das entsprechende FIBPlus-Beispiel unter

examples\src\FB20InsertReturning


Heiko

RSF 8. Jan 2010 10:31

Re: Datensatz ID herausfinden
 
Warum nicht einfach nach dem Abspeicheren das Feld "B_ID" abfragen?

Delphi-Quellcode:
ShowMessage(IntToStr(tTable.FieldByName('B_ID').AsInteger));

hoika 8. Jan 2010 10:49

Re: Datensatz ID herausfinden
 
Hallo,

#RSF#
nein, die Id wird auf dem Server beim Imsert erzeugt
und normalerweise nicht zurückgegeben.

Unter Paradox klappte das allerdings wirklich so,
aber unter einem SQL-Server normalerweise nicht.

Für Firebird (>=2) gibt es die returning Klausel,
siehe #3


Heiko

MrSpock 8. Jan 2010 11:27

Re: Datensatz ID herausfinden
 
Hallo,

ich mache das Insert über eine StoredProcedure und lasse mir von dieser die ID zurückgeben.

alleinherrscher 8. Jan 2010 11:32

Re: Datensatz ID herausfinden
 
Okaydokay, danke für die Antworten. Werd mal schauen, wie das mit den StoredProcedures bzw. mit dem Returning geht...

DeddyH 8. Jan 2010 11:36

Re: Datensatz ID herausfinden
 
Vielleicht ist dieser Thread hilfreich.

alleinherrscher 8. Jan 2010 11:47

Re: Datensatz ID herausfinden
 
Hey, DeddyH, danke!

Wenn ich jetzt in meinem DataSet die SQLs so ändere, dass da steht:

SQL-Code:
INSERT INTO Produkte
  (ProductID
  ,Bezeichnung)
VALUES
  (:ProductID
  ,:Bezeichnung)
RETURNING Id
Wo kann ich dann unter fibplus auf den Returning-Wert zugreifen? Oder denke ich immer noch falsch?

mkinzler 8. Jan 2010 11:51

Re: Datensatz ID herausfinden
 
Ist
Delphi-Quellcode:
<DataSet>.Params[2]

alleinherrscher 8. Jan 2010 12:18

Re: Datensatz ID herausfinden
 
[edit]

Okay klar, verstanden. Allerdings wird der Parameter nicht von Firebird übergeben (mein ParamCount ist Null), jemand eine Idee, warum???

[/edit]

hoika 8. Jan 2010 12:31

Re: Datensatz ID herausfinden
 
Hallo,

warum siehst du nicht einfach in dem mitgelieferten Bsp nach ?

examples\src\FB20InsertReturning


Heiko

taveuni 8. Jan 2010 13:08

Re: Datensatz ID herausfinden
 
Zitat:

Zitat von hoika
Hallo,

#RSF#
nein, die Id wird auf dem Server beim Imsert erzeugt
und normalerweise nicht zurückgegeben.

Unter Paradox klappte das allerdings wirklich so,
aber unter einem SQL-Server normalerweise nicht.
Heiko

Bei MS SqlServer nach dem INSERT:
SELECT @@IDENTITY FELDNAME gibt die ID zurück.

hoika 8. Jan 2010 14:54

Re: Datensatz ID herausfinden
 
Hallo,

ja FB macht das über das returning.

Das S in SQL heisst halt leider nicht Standard.


Heiko

mkinzler 8. Jan 2010 15:37

Re: Datensatz ID herausfinden
 
Zitat:

Das S in SQL heisst halt leider nicht Standard.
Jedes DBMS ist halt anderst strukturiert

hoika 8. Jan 2010 16:24

Re: Datensatz ID herausfinden
 
Hallo,

schön gesagt.
;)


Heiko

alleinherrscher 8. Jan 2010 20:45

Re: Datensatz ID herausfinden
 
Ich hab nu ein Query mit folgendem Code im SQLs Feld:

SQL-Code:
INSERT INTO USER(
    VORNAME,
    NACHNAME,
    ALIAS,
    PASSWORT
)  
VALUES(
    :VORNAME,
    :NACHNAME,
    :ALIAS,
    :PASSWORT
)
RETURNING USER_ID

und führe in Delphi folgendes aus:

Delphi-Quellcode:
  Query1.Close;
  Query1.ParamByName('ALIAS').AsString:=edit1.Text;
  Query1.ParamByName('PASSWORT').AsString:=edit2.Text;
  Query1.Prepare;
  Query1.ExecQuery;
  Transaction.CommitRetaining;
Wenn ich mir Query1.ParamNames(i) für alle i< ParamCount ausgeben lasse kommt raus:

VORNAME
NACHNAME
ALIAS
PASSWORT

Eine USER_ID ist aber nicht vorhanden?!

mkinzler 8. Jan 2010 20:48

Re: Datensatz ID herausfinden
 
Welche Version der Komponente setzt du ein? Es scheint das diese Version das returning nicht kennt.
Btw heisst der Parameter auch anders Ret_xxx o.ä, deshalb besser über den Index gehen

alleinherrscher 8. Jan 2010 20:51

Re: Datensatz ID herausfinden
 
Zitat:

Zitat von mkinzler
Welche Version der Komponente setzt du ein? Es scheint das diese Version das returning nicht kennt.
Btw heisst der Parameter auch anders Ret_xxx o.ä, deshalb besser über den Index gehen

Benutze FIBPlus 6.9.6

Wenn der Parameter anders heißt, müsste es doch ne Fehlermeldung von der Datenbank geben, oder?

//edit ich seh gerade, dass der Interpretor hier im Forum das Wort "USER" in der SQL sprache blau hinterlegt. Also in Wirklichkeit heißt die Datenbank nicht USER sondern BENUTZER.

hoika 9. Jan 2010 08:12

Re: Datensatz ID herausfinden
 
Hallo,

gerade wollte ich wieder meckern,
dass du das Returning-Bsp nicht ansiehst.
Das ist wohl aber nur noch ne "Beta".

Die Returning ist ja kein Parameter,
probier mal FieldByName / Fields.


Heiko

alleinherrscher 9. Jan 2010 10:59

Re: Datensatz ID herausfinden
 
:) Jup, das "FieldsbyName" war der Knackpunkt. Dankeschön!

Wünsche allen ein super verschneites WE...das richtige Wetter, um gemütlich zu programmieren ;)

hoika 9. Jan 2010 11:04

Re: Datensatz ID herausfinden
 
Hallo,

ja schade, dass das Bsp. bei FIBPlus nicht sehr aussagefähig ist.

Zitat:

Wünsche allen ein super verschneites WE...das richtige Wetter, um gemütlich zu programmieren
Also ich war gerade 20 km im Schnee laufen (01:47, also kein Joggen ;) )

*schmerzende Beine massier*


Heiko

mkinzler 9. Jan 2010 12:09

Re: Datensatz ID herausfinden
 
Zitat:

Die Returning ist ja kein Parameter,
probier mal FieldByName / Fields.
Bei FIBPlus vielleicht nicht.


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