Ao usar os using() {}
blocos (sic) conforme mostrado abaixo, e assumindo que cmd1
não está além do escopo do primeiro using() {}
bloco, por que o segundo bloco deve lançar uma exceção com a mensagem
O SqlParameter já está contido por outro SqlParameterCollection
Isso significa que os recursos e / ou identificadores - incluindo os parâmetros ( SqlParameterCollection
) - anexados cmd1
não são liberados quando são destruídos no final do bloco?
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);
}
}
}
NOTA: Fazer cmd1.Parameters.Clear () logo antes da última chave do primeiro bloco using () {} salvará você da exceção (e possível constrangimento).
Se precisar reproduzir, você pode usar os seguintes scripts para criar os objetos:
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