Trong khi sử dụng sử dụng() {} (sic) khối như hình dưới đây, và giả định rằng cmd1 không sống vượt ra ngoài phạm vi của đầu tiên sử dụng() {} khối, tại sao nên ném khối thứ hai một ngoại lệ với thông báo SqlParameter đã được chứa bởi một SqlParameterCollection khác? Điều đó có nghĩa là tài nguyên và/hoặc xử lý - bao gồm các tham số (SqlParameterCollection) - đính kèm với cmd1 không được giải phóng khi bị phá hủy ở cuối khối không?SqlParameter đã được chứa bởi một SqlParameterCollection khác - Có sử dụng() {} cheat?
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 Ý: Làm cmd1.Parameters.Clear() ngay trước khi cú đúp cuối cùng của đầu tiên sử dụng() {} khối sẽ giúp bạn tiết kiệm từ ngoại lệ (và có thể xấu hổ).
Nếu bạn cần để tái tạo, bạn có thể sử dụng các kịch bản sau đây để tạo ra 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
Cảm ơn. Tôi nghi ngờ đó là trường hợp. Nó cũng có nghĩa là SqlParameter kết hợp chính nó với một đối tượng đã được xử lý mà tôi không chắc chắn một điều tốt của nó là –
@JohnGathogo: Vâng, nó liên kết với một đối tượng được xử lý * sau * liên kết đã được hình thành. Nó không phải là lý tưởng, chắc chắn. –
Một lưu ý cho người khác. Tôi phải thực hiện 'Clear' trước khi thoát khỏi khối' using' đầu tiên. Làm điều đó khi vào khối 'using' thứ 2 của tôi vẫn còn ném lỗi này. – Snekse