我有以下类:
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??如果这是一个多线程的问题,我可能会理解,但是我正在调试程序中的代码,并得到了这个错误。
有人能告诉我我错过了什么吗?
发布于 2012-04-20 02:54:50
你之前已经调用过这个方法了吗?你的方法返回了一个SqlDataReader,我不确定它是不是按msdn被关闭了,
当您使用完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
}
}
发布于 2012-04-20 06:09:20
您到底在什么时候调用SqlDataReader ExecutSql(string sql)方法?是在页面加载时吗?因为如果是这样,那么在asp.net中,每当页面上发生任何事件时都会调用页面加载。为了防止出现这种情况,您可以使用以下命令:
if(!Page.IsPostBack)
{
//call SqlDataReader ExecutSql(string sql)
}
这将确保上述方法仅在页面打开时加载时调用一次。如果由于任何事件而发生回发,则不会调用此方法。
发布于 2012-04-21 00:00:21
您还可以在连接字符串中启用MARS:
https://stackoverflow.com/questions/10239579
复制相似问题