은 USING 동안 using() {}아래와 같이 (SiC)를 차단하고, 그 가정 cmd1제의 범위를 넘어 살지 않는 using() {}블록, 제 2 블록 이유는 메시지가 예외를 발생한다
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);
}
}
}
참고 : 첫 번째 using () {} 블록 의 마지막 중괄호 바로 앞에 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