已经是与此命令关联的开放数据阅读器。这怎么可能?

时间:2012-04-20 02:47:14

标签: asp.net sql-server ado.net

我有以下课程:

public class Data
{
    static public SqlDataReader ExecutSql(string sql)
    {
        var cmd = new SqlCommand(sql, SqlCon.Conn);
        var data = cmd.ExecuteReader();
        return data;
    }
}

从asp.net网页调用它,我收到错误:“已经有一个与此命令关联的开放DataReader必须先关闭。”

显然,我在执行数据读取器之前正在实例化一个新的SqlCommand行。我是Web开发的新手(我的背景是WinForms),但即使如此,我也无法理解我是如何拥有一个与一个刚刚创建的Command关联的开放DataReader?我可以理解它是否是一个多线程的问题,但是我正在调试器中的代码并且出现此错误。

有人想告诉我,我在这里缺少什么?

3 个答案:

答案 0 :(得分:3)

您之前是否已经调用此方法?你的方法是返回一个SqlDataReader,我不确定它是否被正确关闭。按照msdn

  

使用时必须显式调用Close方法   SqlDataReader使用关联的SqlConnection进行任何其他操作   目的

我建议您阅读阅读器中的数据并关闭阅读器并返回新类型(DataTable / DataSet或填充属性的自定义类)

using(SqlCommand command =new SqlCommand(sql, SqlCon.Conn))
{
   SqlDataReader reader = command.ExecuteReader();
   while (reader.Read())
   {
     //Fill your object and then use that to return
   }
}

答案 1 :(得分:1)

什么时候调用SqlDataReader ExecutSql(string sql)方法?它是否在页面加载?因为如果是这样,那么在asp.net页面中,每次在页面上发生任何事件时都会调用load。为防止这种情况,您可以使用以下内容:

if(!Page.IsPostBack)
{
    //call SqlDataReader ExecutSql(string sql)
}

这将确保在打开时加载页面时仅调用上述方法一次。如果由于任何事件而发回邮件,则不会调用此方法。

答案 2 :(得分:0)

您还可以在连接字符串中启用MARS