using() {}नीचे दिखाए अनुसार (सिक) ब्लॉकों का उपयोग करते हुए , और यह मानते हुए कि cmd1पहले using() {}ब्लॉक के दायरे से बाहर नहीं रहता है , दूसरे ब्लॉक को संदेश के साथ अपवाद क्यों फेंकना चाहिए
SqlParameter पहले से ही एक और SqlParameterCollection द्वारा समाहित है
क्या इसका मतलब है कि संसाधन और / या हैंडल - पैरामीटर सहित ( SqlParameterCollection) - संलग्न cmd1नहीं हैं, जब ब्लॉक के अंत में इसे नष्ट कर दिया जाता है?
using (var conn = new SqlConnection("Data Source=.;Initial Catalog=Test;Integrated Security=True"))
{
var parameters = new SqlParameter[] { new SqlParameter("@ProductId", SqlDbType.Int ) };
using(var cmd1 = new SqlCommand("SELECT ProductName FROM Products WHERE ProductId = @ProductId"))
{
foreach (var parameter in parameters)
{
cmd1.Parameters.Add(parameter);
}
// cmd1.Parameters.Clear(); // uncomment to save your skin!
}
using (var cmd2 = new SqlCommand("SELECT Review FROM ProductReviews WHERE ProductId = @ProductId"))
{
foreach (var parameter in parameters)
{
cmd2.Parameters.Add(parameter);
}
}
}
नोट: कर रहे हैं cmd1.Parameters.Clear () पहले का उपयोग कर के अंतिम ब्रेस से पहले () {} ब्लॉक आपको अपवाद (और संभव शर्मिंदगी) से बचाएगा।
यदि आपको पुन: पेश करने की आवश्यकता है, तो आप वस्तुओं को बनाने के लिए निम्न स्क्रिप्ट का उपयोग कर सकते हैं:
CREATE TABLE Products
(
ProductId int IDENTITY(1,1) NOT NULL PRIMARY KEY CLUSTERED,
ProductName nvarchar(32) NOT NULL
)
GO
CREATE TABLE ProductReviews
(
ReviewId int IDENTITY(1,1) NOT NULL PRIMARY KEY CLUSTERED,
ProductId int NOT NULL,
Review nvarchar(128) NOT NULL
)
GO