AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Datenbanken Delphi Interbase: Generierte ID ermitteln ?
Thema durchsuchen
Ansicht
Themen-Optionen

Interbase: Generierte ID ermitteln ?

Ein Thema von mschaefer · begonnen am 5. Apr 2003 · letzter Beitrag vom 16. Okt 2004
Antwort Antwort
Seite 1 von 3  1 23      
Benutzerbild von mschaefer
mschaefer

Registriert seit: 4. Feb 2003
Ort: Hannover
2.032 Beiträge
 
Delphi 12 Athens
 
#1

Interbase: Generierte ID ermitteln ?

  Alt 5. Apr 2003, 13:19
Moin, moin in die Runde

Wie kann ich an eine mit einer Trigger/Generator
angelegte ID herankommen.

Möchte nach einem Post den zuletzt bearbeiteen
Datensatz noch ausgewählt haben und brauche dafür
die generierte ID...


Grüße // Martin
Martin Schaefer
  Mit Zitat antworten Zitat
Gast
(Gast)

n/a Beiträge
 
#2
  Alt 6. Apr 2003, 23:16
Hallo MSchaefer 8)

ich werde Dir am Montag helfen... jetzt bin ich nur kurz hier...


Gruß

Paul Jr.

P.S.

Es seitdem jemand wird schneller als ich...
  Mit Zitat antworten Zitat
Benutzerbild von mschaefer
mschaefer

Registriert seit: 4. Feb 2003
Ort: Hannover
2.032 Beiträge
 
Delphi 12 Athens
 
#3

Trigger / Generator

  Alt 7. Apr 2003, 08:57
Hallo Paul

bisher habe ich keine richtige Lösung gefunden. Eigenltich denke ich,
das es vermutlich über eine Stored Procedure laufen müßte, aber da
bisher kaum Erfahrung...

Grüße // Martin
Martin Schaefer
  Mit Zitat antworten Zitat
Gast
(Gast)

n/a Beiträge
 
#4
  Alt 7. Apr 2003, 09:03
Hallo Martin 8)

Deine Vermutung ist ein Volltreffer!

So habe ich auch damals gemacht... ich muss nur etwas Suchen in meinem Durcheinander...(also gegen Nachmittag mache ich es... und ich hoffe das ich findig werde)

Gruß

Paul Jr.
  Mit Zitat antworten Zitat
Lemmy
Online

Registriert seit: 8. Jun 2002
Ort: Berglen
2.380 Beiträge
 
Delphi 10.3 Rio
 
#5
  Alt 7. Apr 2003, 09:08
Hi mschaefer,

Wenn Du ID's für den Primary Key über einen Trigger in die Tabelle einträgst, hast Du immer das Problem, an diese Info ranzukommen. Dir bleibt nur der Weg für den eben eingetragenen Datensatz eine eindeutige Abfrage hinzubekommen, damit du die ID zurück bekommst. Dazu gibt es 2 Alternativen:

1. Verwende (falls Du die IBX verwendest) die Komponente TIBDataSet und dort die Eigenschaft "GeneratorField"
Falls Du über SQL eine Massenübernahme von Daten machen musst, dann kannst DU den Generator auch in die SQL einfügen:

INSERT INTO Tabelle VALUES (Gen_ID(Generatorname,1),Spalte1, SPalte2,..)

2. Hol Dir den Generator ID über ne SQL:
Select Gen_ID(Generatorname,1) AS ID from rdb§database;

die Tabelle rdb$Database existiert in jeder IB/FB DB und beinhaltet immer nur einen Datensatz.

3. Das ganze über SP machen, wobei das etwas Schreibarbeit bedeutet:

CREATE PROCEDURE InsertDATA(Wert1 Typ1, Wert2 Typ2,...)
AS
BEGIN
INSERT INTO Tabelle VALUES (Gen_ID(GeneratorName,1), Wert1, Wert2,...)
END^

Grüße
Lemmy
  Mit Zitat antworten Zitat
Gast
(Gast)

n/a Beiträge
 
#6
  Alt 7. Apr 2003, 09:18
Hallo Lemmy 8) ,

Dein zweiter Vorschlag mit der InterBase System Tabelle ist gut... aber nicht
100% sicher (bei Mehrbenutzer)...

Dein dritter Lösungs-Vorschlag ist der Beste ... nun... diese Storage-Procedure
sollte ein Rückgabewert haben...

Da ich lange nichts mit InterBase gemacht habe könntest Du vielleicht diese
mit einem Rückgabewert versehen...also mit dem neuem ID..., da wie ich denke
hat Martin schon etwas eilig...


Gruß

Paul Jr.
  Mit Zitat antworten Zitat
Gast
(Gast)

n/a Beiträge
 
#7
  Alt 7. Apr 2003, 09:24
Ich meine so was in dem Sinne:

xID = Gen_ID(GeneratorName,1) // Rückgabewert...

und erst dann INSET INTO usw... das weißt Du schon...


Gruß


Paul Jr.
  Mit Zitat antworten Zitat
Lemmy
Online

Registriert seit: 8. Jun 2002
Ort: Berglen
2.380 Beiträge
 
Delphi 10.3 Rio
 
#8
  Alt 7. Apr 2003, 10:17
Zitat von Paul Jr.:
HDein zweiter Vorschlag mit der InterBase System Tabelle ist gut... aber nicht
100% sicher (bei Mehrbenutzer)...
Bitte um Erklärung: Warum ist das nicht sicher???

Zitat von Paul Jr.:
Dein dritter Lösungs-Vorschlag ist der Beste ... nun... diese Storage-Procedure
sollte ein Rückgabewert haben...
Uuups... habe ich doch glatt vergessen....


Grüße
Lemmy
  Mit Zitat antworten Zitat
Gast
(Gast)

n/a Beiträge
 
#9
  Alt 7. Apr 2003, 10:23
Hallo Lemmy

ganz einfach... falls zwei User gleichzeitig einen neuen Datensatz anlegen (in der gleichen Tabelle)... dann steht in dem Generator nicht mehr dieses Wert die man braucht...(bei langsamen Zugriffen ist das schnell passiert)...

Gruß

Paul Jr.
  Mit Zitat antworten Zitat
Lemmy
Online

Registriert seit: 8. Jun 2002
Ort: Berglen
2.380 Beiträge
 
Delphi 10.3 Rio
 
#10
  Alt 7. Apr 2003, 10:35
Zitat von Paul Jr.:
ganz einfach... falls zwei User gleichzeitig einen neuen Datensatz anlegen (in der gleichen Tabelle)... dann steht in dem Generator nicht mehr dieses Wert die man braucht...(bei langsamen Zugriffen ist das schnell passiert)...
Halt, halt, da haben wir aneinander vorbeigeschrieben, die Schuld nehme ich auf mich! In der 2. Lösung meinte ich nicht, dass NACH dem Einfügen der Generator-Stand abgefragt werden soll (da hätte ich dann ja eigentlich ein ",0" verwende müssen) sondern, der Wert der ID soll VOR dem Einfügen über ne normale Select abgefragt werden, per "Hand" dann in das InsertSQL eingefügt werden und fertig!

Natürlich sollte man niemals NACH dem Einfügen den Generatorstand abfragen und dann Rückschlüsse auf die vom Insert verwendete Generator-ID machen!!!!

Hier noch die Insert Proc mit Rückgabewert:
Code:
SET TERM ^ ;

CREATE PROCEDURE TestNeu1 (Wert1 VARCHAR(20))
RETURNS (NewID INTEGER)
AS
BEGIN
  FOR
    SELECT Gen_ID(Generatorname,1) from rdb$database into NewID
  do
  begin
    insert into Tabelle Values (:NewID, :Wert1);
    suspend;
  end
END^
Grüße
Lemmy
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 3  1 23      


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 18:14 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