ในขณะที่ใช้using() {}
บล็อก (sic) ดังที่แสดงด้านล่างและสมมติว่า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