आप पहली बार में कई बयानों में ऐसा क्यों कर रहे हैं? क्यों नहीं:
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()
retrieve को पुनः प्राप्त कर सकते हैं यदि आप चाहते हैं, तो निश्चित रूप से, 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
इसे संग्रहित प्रक्रिया में रखना और भी अधिक साफ होगा।