Trong khi sử dụng các khối using() {}
(sic) như được hiển thị bên dưới và giả sử rằng khối cmd1
đó không nằm ngoài phạm vi của using() {}
khối đầu tiên , thì tại sao khối thứ hai lại đưa ra một ngoại lệ với thông báo
SqlParameter đã được chứa bởi một SqlParameterCollection khác
Có nghĩa là các tài nguyên và / hoặc các xử lý - bao gồm các tham số ( SqlParameterCollection
) - được gắn vào cmd1
không được giải phóng khi nó bị phá hủy ở cuối khối?
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);
}
}
}
LƯU Ý: Thực hiện cmd1.Parameters.Clear () ngay trước dấu ngoặc nhọn cuối cùng của khối using () {} đầu tiên sẽ giúp bạn thoát khỏi trường hợp ngoại lệ (và có thể là sự bối rối).
Nếu bạn cần tái tạo, bạn có thể sử dụng các tập lệnh sau để tạo các đối tượng:
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