Perché lo stai facendo in più affermazioni in primo luogo? Perché no:
INSERT dbo.Items (item_name, item_cost, item_code)
OUTPUT inserted.ItemID, @ProjectID, @ItemQuantity
INTO dbo.project_items(item_id, project_id, item_quantity)
VALUES (@ItemName, @ItemCost, @ItemCode);
Ora devi solo chiamare un ExecuteNonQuery()
e la tua app non deve preoccuparsi dell'effettivo SCOPE_IDENTITY()
valore generato. (Puoi comunque recuperare SCOPE_IDENTITY()
se vuoi, ovviamente, usando ExecuteScalar
- ma come fa giustamente notare Nenad, scegline uno invece di chiamarli entrambi.)
Poiché ora sappiamo che c'è una chiave esterna esplicita qui, possiamo comunque ridurre il tuo codice C# a una chiamata anche se non possiamo usare OUTPUT
clausola.
DECLARE @i INT;
INSERT dbo.Items (item_name, item_cost, item_code)
SELECT @ItemName, @ItemCost, @ItemCode;
SELECT @i = SCOPE_IDENTITY();
INSERT dbo.project_items(item_id, project_id, item_quantity)
SELECT @i, @ProjectID, @ItemQuantity
SELECT @i; -- if necessary
Sarebbe ancora più pulito inserirlo in una procedura memorizzata.