Pourquoi faites-vous cela dans plusieurs déclarations en premier lieu ? Pourquoi pas :
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);
Maintenant, vous n'avez qu'à appeler un seul ExecuteNonQuery()
et votre application n'a pas à se soucier du SCOPE_IDENTITY()
valeur générée. (Vous pouvez toujours récupérer SCOPE_IDENTITY()
si vous voulez, bien sûr, en utilisant ExecuteScalar
- mais comme le souligne à juste titre Nenad, choisissez-en un au lieu d'appeler les deux.)
Puisque nous savons maintenant qu'il y a une clé étrangère explicite ici, nous pouvons toujours réduire votre code C# à un seul appel même si nous ne pouvons pas utiliser le OUTPUT
clause.
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
Ce serait encore plus propre de mettre cela dans une procédure stockée.