最佳答案
如下所示使用 using() {}
(sic)块,并假设 cmd1
不超出第一个 using() {}
块的范围,那么为什么第二个块会抛出带有消息的异常
SqlParameter 已经包含在另一个 SqlParameter 集合中
这是否意味着资源和/或句柄(包括参数(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);
}
}
}
注意: 执行 cmd1.Parameter。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