Mentre si utilizzano i using() {}blocchi (sic) come mostrato di seguito e supponendo che cmd1non vivi oltre l'ambito del primo using() {}blocco, perché il secondo blocco dovrebbe generare un'eccezione con il messaggio
SqlParameter è già contenuto da un altro SqlParameterCollection
Significa che le risorse e / o gli handle - inclusi i parametri ( SqlParameterCollection) - allegati cmd1non vengono rilasciati quando vengono distrutti alla fine del blocco?
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: L' esecuzione di cmd1.Parameters.Clear () appena prima dell'ultima parentesi graffa del primo blocco using () {} ti salverà dall'eccezione (e dal possibile imbarazzo).
Se è necessario riprodurre, è possibile utilizzare i seguenti script per creare gli oggetti:
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