![]() |
Datenbank: MS SQL Server • Zugriff über: ODBC
automatischen erstellter IDENTITY Wert ermitteln
Ich habe eine Tabelle mit Schlüssel via Identität = Ja.
Wenn ich jetzt einen neuen Datensatz hinzufüge wird die ID ja selber erstellt. Gibt es eine einfache Möglichkeit zu erfahren welchen Wert das Feld bekommen hat? ![]() |
Re: automatischen erstellter IDENTITY Wert ermitteln
Hallo Thomas,
wie fügst du Datensätze hinzu? Wenn ein einen offenen DataSet hast, dann findest du den Identity-Wert jeweils nach dem Speichern einzelner Datensätze im entsprechenden Feld. Fügst du hingegen per SQL INSERT hinzu, so musst du zu solchen Tricks greifen, wie sie Microsoft empfiehlt. Freundliche Grüße |
Re: automatischen erstellter IDENTITY Wert ermitteln
ich mach es via SQL.
Schade, so bringt mir das nix. Dann kann ich auch selber den Schlüssel vergeben und verwalten. Nimmt sich nix vom Aufwand |
Re: automatischen erstellter IDENTITY Wert ermitteln
Zitat:
Ich hab jetzt den MS Artikel nicht gelesen, aber mit
SQL-Code:
kommst du an den zuletzt vergebenen Identiy Wert. Diesen kannst du in einem Event deiner Query auslesen.
select @identity
|
Re: automatischen erstellter IDENTITY Wert ermitteln
:party:
Super Stimmt
Delphi-Quellcode:
Ist ja doch ganz einfach! DANKE!!with FQry do begin SQL.clear; SQL.Add('SELECT @@IDENTITY'); Open; result := Fields.Fields[0].AsInteger; end; |
Re: automatischen erstellter IDENTITY Wert ermitteln
Eine äquivalente Schreibweise wäre:
Delphi-Quellcode:
Und ein vielleicht interessanter Thread:
with FQry do
begin SQL.Text := 'SELECT @@IDENTITY'; Open; Result := Fields[0].AsInteger; end; ![]() |
Re: automatischen erstellter IDENTITY Wert ermitteln
Schreib Dir dafür eine stored Procedure, denn wenn Du '@Identity' nicht im gleichen Batch abfragst (und zwischenzeitlich ein anderes INSERT ausgeführt wird), hast Du den falschen Wert!
z.B. so:
SQL-Code:
Und in Delphi:
Create Procedure Customer_New @ID int output
as set nocount on insert into Customer defaultvalues -- Geht nur, wenn alle Felder default-Werte (NULL oder etwas explizites) haben select @ID = @@Identity set nocount on
Delphi-Quellcode:
Das ist etwas langsamer, aber allgemeingültig.
Procedure CreateNewCustomer (aCustomer : TCustomer);
Begin spCustomerNew.ExecProc; // Neuen Datensatz erstellen aCustomer.ID := spCustomerNew.Parameters.ParamValues['@ID']; // ID abholen // Ab hier machst Du ein UPDATE Customer SET .... WHERE ID = :ID // Datensatz befüllen End; Ich versuche allerdings, die Kundendaten gleich der Stored Procedure zu übergeben:
SQL-Code:
und in Delphi
Create Procedure Customer_New @Name VarChar (80), @Address VarChar(80), @ID int output
as set nocount on insert into Customer (Name, Address) Values (@Name, @Address) select @ID = @@Identity set nocount on
Delphi-Quellcode:
Ich bevorzuge so eine Abstraktion, weil man vielleicht irgendwelche Schweinereien anstellen will, wenn man einen Kunden anlegt. Das kann man dann machen, ohne den Quelltext und die eigentliche Logik anzufassen.
Procedure CreateNewCustomer (aCustomer : TCustomer);
Begin spCustomerNew.Parameters.ParamValues['@Name'] := aCustomer.Name; spCustomerNew.Parameters.ParamValues['@Address'] := aCustomer.Address; spCustomerNew.ExecProc; // Neuen Datensatz erstellen aCustomer.ID := spCustomerNew.Parameters.ParamValues['@ID']; // ID abholen End; |
Alle Zeitangaben in WEZ +1. Es ist jetzt 21:55 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