1

我有以下课程:

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),但即便如此,我仍然无法理解我如何已经拥有一个与刚刚创建的命令相关联的开放 DataReader?我可能理解这是否是多线程类型的问题,但我正在调试器中逐步执行代码并收到此错误。

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

4

3 回答 3

3

你之前有没有调用过这个方法?您的方法返回一个 SqlDataReader,我不确定它是否正确关闭。根据msdn

当您通过使用 SqlDataReader 以将关联的 SqlConnection 用于任何其他目的时,您必须显式调用 Close 方法。

我建议您从阅读器中读取数据并关闭阅读器并返回新类型(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
   }
}
于 2012-04-20T02:54:49.980 回答
1

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

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

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

于 2012-04-20T06:09:19.603 回答
0

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

于 2012-04-21T00:00:21.023 回答