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

时间:2018-12-07 10:15:51

标签: c# asp.net iis-7 datareader sqldataadapter

我有一个使用ADO.Net连接到SQL Server 2012的asp.net C#应用程序(.net 4.0),并且遇到一条错误消息:

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

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

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

  • 即使由IIS 7部署在IIS7中,应用程序也可以正常工作 单用户。

  • 仅当多个用户开始使用IIS7中托管的网站时,才会发生错误。

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

1 个答案:

答案 0 :(得分: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();
}

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