そもそもなぜ複数のステートメントでこれを行うのですか?理由:
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()
を 1 つ呼び出すだけで済みます。 アプリは実際の SCOPE_IDENTITY()
を気にする必要はありません 生成される値。 (まだ SCOPE_IDENTITY()
を取得できます もちろん、必要に応じて ExecuteScalar
を使用します - しかし、Nenad が正しく指摘しているように、両方を呼び出すのではなく、どちらかを選択してください。)
ここに明示的な外部キーがあることがわかったので、OUTPUT
を使用できなくても、C# コードを 1 回の呼び出しに減らすことができます。
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
これをストアド プロシージャに入れるとさらにきれいになります。