Защо правите това в множество изявления на първо място? Защо не:
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);
Сега трябва да извикате само един ExecuteNonQuery()
и приложението ви не трябва да се интересува от действителния SCOPE_IDENTITY()
генерирана стойност. (Все още можете да извлечете SCOPE_IDENTITY()
ако искате, разбира се, с помощта на ExecuteScalar
- но както Ненад правилно отбелязва, изберете един, вместо да плащате и на двата.)
Тъй като вече знаем, че тук има изричен външен ключ, пак можем да намалим вашия C# код до едно извикване, дори ако не можем да използваме OUTPUT
клауза.
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
Би било още по-чисто да поставите това в съхранена процедура.