错误:已经有一个打开的 DataReader 与此命令关联,必须先关闭。多个用户

Posted

技术标签:

【中文标题】错误:已经有一个打开的 DataReader 与此命令关联,必须先关闭。多个用户【英文标题】:ERROR:There is already an open DataReader associated with this Command which must be closed first. Multiple Users 【发布时间】:2018-12-07 10:15:51 【问题描述】:

我有一个使用 ADO.Net 连接到 SQL Server 2012 的 asp.net C# 应用程序 (.net 4.0),我遇到了如下错误:

[InvalidOperationException: 已经有一个打开的 DataReader 与此命令关联,必须先关闭。]

我很清楚 DataReader 是什么,但我的问题是在以下情况下出现此错误:

我的应用程序中根本没有使用任何 DataReader,我只有 到处都使用 DataAdapters。代码在运行时工作正常 本地环境,没有错误。

即使在 IIS7 中部署后,应用程序也能正常工作 单用户。

仅当多个用户开始使用托管在 IIS7 中的网站时才会出现该错误。

请帮忙,我也怀疑我在 IIS7 中托管的任何问题

【问题讨论】:

【参考方案1】:

经过反复试验,终于发现是SqlConnections的问题。我以前做的是在我的 DAL 层对象的实例化时打开一个连接。因此,每当来自同一个 DAL 对象的两个方法一起调用时,它都会抛出错误。 我通过在每次调用数据库时打开和关闭连接来解决它。 现在一切正常。这也允许最大数量的用户一次使用该应用程序。以下是我来自 DAL 的代码示例:-

DataTable dt = new DataTable();

try

    using (SqlConnection sqlcon = new SqlConnection(ConfigurationManager.ConnectionStrings["MyConnectionString"].ToString()))
    
        if (sqlcon.State == ConnectionState.Closed)
            sqlcon.Open();

        SqlCommand sqlCommand = new SqlCommand
        
            Connection = sqlcon,
            CommandType = CommandType.StoredProcedure,
            CommandText = "MyStoredProc"
        ;

        sqlCommand.Parameters.AddWithValue("@Parameter1", Parameter1);

        using (SqlDataAdapter adapter = new SqlDataAdapter(sqlCommand))
        
            adapter.Fill(dt);
        
    
    return dt;

catch (Exception exp)

    LogHelper.LogError(string.Concat("Exception Details: ", ExceptionFormatter.WriteExceptionDetail(exp)));
    throw exp;

finally

    dt.Dispose();

如果你知道的话,请发布一个更好的方法,谢谢。

【讨论】:

以上是关于错误:已经有一个打开的 DataReader 与此命令关联,必须先关闭。多个用户的主要内容,如果未能解决你的问题,请参考以下文章

实体框架运行时错误 - 已经有一个打开的 DataReader 与此命令关联,必须先关闭

已经有一个打开的 DataReader 与此命令关联,必须先关闭

实体框架:已经有一个打开的 DataReader 与此命令关联

已经有一个打开的 DataReader 与此命令关联,必须先关闭

已经有一个与此命令关联的打开的 DataReader 必须首先关闭 linq [重复]

已经有一个与此命令关联的打开DataReader,必须先关闭它