Hvorfor gør du dette i flere udsagn i første omgang? Hvorfor ikke:
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 skal du kun kalde én ExecuteNonQuery()
og din app behøver ikke at bekymre sig om den faktiske SCOPE_IDENTITY()
genereret værdi. (Du kan stadig hente SCOPE_IDENTITY()
hvis du selvfølgelig vil bruge ExecuteScalar
- men som Nenad rigtigt påpeger, vælg en i stedet for at kalde begge.)
Da vi nu ved, at der er en eksplicit fremmednøgle her, kan vi stadig reducere din C#-kode til ét opkald, selvom vi ikke kan bruge 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
Ville være endnu renere at sætte dette ind i en lagret procedure.