gpt4 book ai didi

c# - SqlParameter 已包含在另一个 SqlParameterCollection 中 - 是否使用(){}作弊?

转载 作者:IT王子 更新时间:2023-10-29 03:40:49 28 4
gpt4 key购买 nike

当使用如下所示的 using() {} (sic) block 时,并假设 cmd1 没有超出第一个 using 的范围() {} block ,为什么第二个 block 要抛出消息异常

The SqlParameter is already contained by another SqlParameterCollection

这是否意味着附加到 cmd1 的资源和/或句柄 - 包括参数 (SqlParameterCollection) 在 block 末尾被销毁时不会被释放?

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() {} block 的最后一个大括号之前执行 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

最佳答案

我怀疑 SqlParameter“知道”它是哪个命令的一部分,并且当命令被释放时该信息不会被清除,但是当您调用时会被清除command.Parameters.Clear()

我个人认为我首先会避免重用这些对象,但这取决于您:)

关于c# - SqlParameter 已包含在另一个 SqlParameterCollection 中 - 是否使用(){}作弊?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7837762/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com