Mengapa Anda melakukan ini dalam banyak pernyataan? Mengapa tidak:
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);
Sekarang Anda hanya perlu memanggil satu ExecuteNonQuery()
dan aplikasi Anda tidak perlu peduli dengan SCOPE_IDENTITY()
actually yang sebenarnya nilai yang dihasilkan. (Anda masih dapat mengambil SCOPE_IDENTITY()
jika Anda ingin, tentu saja, menggunakan ExecuteScalar
- tapi seperti yang ditunjukkan Nenad dengan benar, pilih salah satu daripada memanggil keduanya.)
Karena sekarang kami tahu bahwa ada kunci asing eksplisit di sini, kami masih dapat mengurangi kode C# Anda menjadi satu panggilan meskipun kami tidak dapat menggunakan OUTPUT
klausa.
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
Akan lebih bersih untuk memasukkan ini ke dalam prosedur tersimpan.