我有以下课程:
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?我可以理解它是否是一个多线程的问题,但是我正在调试器中的代码并且出现此错误。
有人想告诉我,我在这里缺少什么?
答案 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: