Waarom doe je dit in de eerste plaats in meerdere verklaringen? Waarom niet:
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 hoeft u slechts één ExecuteNonQuery()
. aan te roepen en uw app hoeft zich geen zorgen te maken over de eigenlijke SCOPE_IDENTITY()
waarde gegenereerd. (Je kunt nog steeds SCOPE_IDENTITY()
ophalen als je wilt, natuurlijk, gebruik makend van ExecuteScalar
- maar zoals Nenad terecht opmerkt, kies er een in plaats van beide te bellen.)
Aangezien we nu weten dat hier een expliciete externe sleutel is, kunnen we uw C#-code nog steeds terugbrengen tot één aanroep, zelfs als we de OUTPUT
niet kunnen gebruiken clausule.
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
Het zou nog schoner zijn om dit in een opgeslagen procedure te stoppen.