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

标签 c# .net sql-server ado.net

当使用如下所示的 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/

相关文章:

C#/Excel : Working Around Maximum Series Size On Chart

c# - SQL CE 最大长度

c# - .NET 在第 3 方应用程序中获取所有异常

c# - 如何在 Guid/UNIQUEIDENTIFIER (SQL Server) 中解释 #

c# - 如何还原对其 MDF 和 LDF 文件使用相同命名方案的多个 SQL Server 数据库

c# - 访问动态创建的控件 (c#)

c# - 您可以在代码中执行 NetTcpBinding 吗?你应该?

c# - .NET 是否支持 SOAP 消息传递协议(protocol) RPC/literal?

c# - 通过 id linq to xml C# 选择一个对象

c# - 编辑自定义 SSIS PipelinComponent 抛出错误 "value of ' null' is not valid for 'stream' "