Varför gör du detta i flera påståenden i första hand? Varför inte:
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);
Nu behöver du bara anropa en ExecuteNonQuery()
och din app behöver inte bry sig om den faktiska SCOPE_IDENTITY()
värde genererat. (Du kan fortfarande hämta SCOPE_IDENTITY()
om du vill, naturligtvis, använda ExecuteScalar
- men som Nenad helt riktigt påpekar, välj en istället för att ringa båda.)
Eftersom vi nu vet att det finns en explicit främmande nyckel här, kan vi fortfarande reducera din C#-kod till ett anrop även om vi inte kan använda OUTPUT
klausul.
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
Skulle vara ännu renare att lägga detta i en lagrad procedur.