¿Por qué estás haciendo esto en múltiples declaraciones en primer lugar? Por qué 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);
Ahora solo tienes que llamar a un ExecuteNonQuery()
y su aplicación no tiene que preocuparse por el SCOPE_IDENTITY()
valor generado. (Aún puede recuperar SCOPE_IDENTITY()
si quieres, por supuesto, usando ExecuteScalar
- pero como Nenad señala acertadamente, elija uno en lugar de llamar a ambos).
Como ahora sabemos que aquí hay una clave externa explícita, aún podemos reducir su código C# a una sola llamada, incluso si no podemos usar OUTPUT
cláusula.
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
Sería aún más limpio poner esto en un procedimiento almacenado.