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:
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
Und in Delphi:
Delphi-Quellcode:
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;
Das ist etwas langsamer, aber allgemeingültig.
Ich versuche allerdings, die Kundendaten gleich der Stored Procedure zu übergeben:
SQL-Code:
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
und in Delphi
Delphi-Quellcode:
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;
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.