Autor Beitrag
MasterBasti
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 38

Windows XP
D6 Prof.
BeitragVerfasst: Mi 18.01.06 17:50 
Hallo zusammen,

ich arbeite gerade an einer ziemlich großen Multi-User-Anwendung.
Jetzt stellt sich mir jedoch das Problem bei einem neuen Eintrag den Autoincrement-Wert
zuverlässig zurückzugeben.

Heisst, ich mache einen neuen Datensatz und brauche dann dringend dessen ID, welche per
Autoincrement zugeteilt wurde um in weiteren Tabellen zu schreiben....

Ich stelle mir vor, dies mir den Parametern eines UpdateSQL´s zu lösen.....
Also qausi die ID dort beim Insert mit zu speichern.

Like:

ausblenden Delphi-Quelltext
1:
INSERT INTO TABELLE () VALUES () RETURN ID INTO PARAMETERNAME					


Bloß wie ist jetzt der Code genau, bzw. geht das überhaupt ?

Gruß

MasterBasti
UGrohne
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Veteran
Beiträge: 5502
Erhaltene Danke: 220

Windows 8 , Server 2012
D7 Pro, VS.NET 2012 (C#)
BeitragVerfasst: Mi 18.01.06 20:37 
Kommt auf die Datenbank an. Aber so einen Befehl wie Du in derzeit verwenden willst, gibt es im Moment noch nicht. Firebird 2.0 wird aber so etwas bieten:
ausblenden SQL-Anweisung
1:
INSERT INTO TABELLE () VALUES () RETURNING ID;					

Bis dahin musst Du es aber in FB mit einer Stored Procedure machen, wenn Du alles in einem haben willst oder Du setzt den neuen ID-Wert von Hand, indem Du vorher den Generator abfragst.
mkinzler
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 4106
Erhaltene Danke: 13


Delphi 2010 Pro; Delphi.Prism 2011 pro
BeitragVerfasst: Mi 18.01.06 21:00 
Für diesen Zweck gibt es bei Zeos die Klasse TZSequenz mit Hilfe der man den Aktuelle Wert der Sequenz ( letzter vergebener Wert bzw den nächsten Wert ermittlen kann.

_________________
Markus Kinzler.
MasterBasti Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 38

Windows XP
D6 Prof.
BeitragVerfasst: Mi 18.01.06 22:49 
HEy, danke erstmal für eure schnellen Antworten....

Zitat:
Für diesen Zweck gibt es bei Zeos die Klasse TZSequenz mit Hilfe der man den Aktuelle Wert der Sequenz ( letzter vergebener Wert bzw den nächsten Wert ermittlen kann.


Wie kommt diese Konkret zum einsatz, bzw. wie wende ich diese an ?
Ich habe z.B. eine bestimmte Tabelle KundenDB, in welche ein Eintrag per UpdateSQL erfolgt, wie und
wo kommt jetzt diese Klasse zum Einsatz ?

Würde mich nochmal über Antwort freuen.
mkinzler
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 4106
Erhaltene Danke: 13


Delphi 2010 Pro; Delphi.Prism 2011 pro
BeitragVerfasst: Mi 18.01.06 23:07 
Ich habe selber noch nicht mit dieser neuen Komponente gearbeitet (gibts es bisher nur in der alpha Version). Allgemein werden Sequenzen im neuen SQL2003 Standard zur Generierung eindeutiger Schlüssel verwendet. ( Kommt von Oracle wird u.a. aber auch in FB ab 1.5.2 unterstützt.)
Die Komponente wird mit einer TZConnection verbunden. Hat eine Eigenschaft SequenzNmae ( müßte der Namen des Generator/Sequenz sein). Nun gibt es die Eigenschaften GetCurrentValue und GetNextValue. Welche die letzte und die nächste ID einer Sequenz darstellen. Mit der ersten müßte nach einem Insert die vergebene ID ermittelt werden könne. Habe das Ganze aber noch nicht getestet. Im offiziellen Zeosforum wurde die seegernet.koolhost.d.../viewtopic.php?t=344Frage auch gestellt, aber leider noch nicht beantwortet.

_________________
Markus Kinzler.
MasterBasti Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 38

Windows XP
D6 Prof.
BeitragVerfasst: Do 19.01.06 19:00 
Gibt es denn evtl. noch eine andere Möglichkeit ?
Habe ehrlich gesagt keine große Lust meine mitlehrweile 50 Tabellen neu in meinen Datenmodul zu erstellen ;-)

Kann doch nicht sein, dass ich der einzige bin mit diesem Problem :(

Gruß

Master-Basti
Blawen
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 616
Erhaltene Danke: 33

Win XP, Vista, 7
Delphi 5 Prof., BDS 2006 Prof. RAD Studio XE
BeitragVerfasst: Sa 18.02.06 14:27 
user profile iconMasterBasti hat folgendes geschrieben:
Gibt es denn evtl. noch eine andere Möglichkeit ?
Habe ehrlich gesagt keine große Lust meine mitlehrweile 50 Tabellen neu in meinen Datenmodul zu erstellen ;-)

Kann doch nicht sein, dass ich der einzige bin mit diesem Problem :(

Gruß

Master-Basti


Der Topic ist zwar älter, aber vielleicht trotzdem noch "aktuell" ?

Wie wäre es hiermit:

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
var ID : Integer;

{ Den neu erstellten Datensatz finden und die Datensatznummer (ID) bestimmen }
ZQ.SQL.Text := 'Select LAST_INSERT_ID()';
ZQ.Active   := True;
ID          := ZQ.Fields[0].AsString;
(Das Beispiel stimmt für eine MySQL-DB. Welche Du einsetzt, hast Du leider nicht geschrieben - in anderen DB dürfte es gleich/ähnlich funktionieren)

Gruss
Blawen
afk
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 102

Win 2K, Win XP
Delphi 2006 Arch., Delphi 6 Ent., MS-SQL 2005 & 2000
BeitragVerfasst: Sa 18.02.06 16:07 
In TSQL (MS SQL-Server) geht das mit

ausblenden SQL-Anweisung
1:
Select @@Identity					

direkt nach der Insert-Query.

Gruß Axel

_________________
Man muß sparn wo mn knn !
Segelflieger
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 124

WinXP Pro
D7 Prof
BeitragVerfasst: Di 28.02.06 23:34 
Sorry für das Thread-Ausgraben :wink:

aber ich habe ein ähnliches Problem:
Ich benutze eine Paradox7-Tabelle und die BDE-Komponente TTable. Die Tabelle enthält ein AutoIncrement-Feld, dessen Wert ich dringend brauche, sobald ich einen neuen Datensatz per TableX.Append erstellt habe.

Kann mir da jemand weiterhelfen?

_________________
Früher hatten die Menschen Angst vor der Zukunft. Heute muss die Zukunft Angst vor den Menschen haben.