Warum machst du das überhaupt in mehreren Anweisungen? Warum nicht:
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);
Jetzt müssen Sie nur noch ein ExecuteNonQuery()
aufrufen und Ihre App muss sich nicht um die eigentliche SCOPE_IDENTITY()
kümmern Wert generiert. (Sie können immer noch SCOPE_IDENTITY()
abrufen wenn Sie möchten, natürlich mit ExecuteScalar
- aber wie Nenad zu Recht betont, wählen Sie eine aus, anstatt beide anzurufen.)
Da wir jetzt wissen, dass es hier einen expliziten Fremdschlüssel gibt, können wir Ihren C#-Code immer noch auf einen Aufruf reduzieren, auch wenn wir den OUTPUT
nicht verwenden können Klausel.
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
Noch sauberer wäre es, dies in eine gespeicherte Prozedur zu packen.