已经有一个与此命令关联的开放DataReader 必须先关闭。
当同一个人在不同系统上同时打开同一页面时,我面临这个问题。 我已经对此进行了大量搜索,但没有找到成功的解决方案。
我累了:
MultipleActiveResultSets = true
仅在创建上述条件时才会出现此问题。请告诉我真正有效的解决方案
这是我使用的连接功能
public DataSet SelectDs(string str)
{
DataSet ds = new DataSet();
if (con.State == ConnectionState.Closed)
{
con.ConnectionString = ConStr;
con.Open();
}
cmd.CommandText = str;
cmd.Connection = con;
cmd.CommandTimeout = 12000;
adpt.SelectCommand = cmd;
adpt.Fill(ds);
con.Close();
return ds;
}
答案 0 :(得分:2)
以这种方式使用全局连接对象是一种致命的罪。它在WinForms应用程序中很糟糕(非常糟糕),但在ASP.NET中是致命的。 (正如你所发现的那样)
一次性物体(和连接物之类的昂贵物品)的使用模式是
CREATE, OPEN, USE, CLOSE, DESTROY
存在Connection Pooling机制,以便更轻松地使用此模式 相反,你试图反对它,你付出后果。
您的代码应该重写为
public DataSet SelectDs(string str)
{
DataSet ds = new DataSet();
using(SqlConnection con = new SqlConnection(constring)) // CREATE
using(SqlCommand cmd = new SqlCommand(str, con)) // CREATE
{
con.Open(); // OPEN
cmd.CommandTimeout = 12000;
using(SqlAdapter adpt = new SqlAdapter(cmd)) // USE
adpt.Fill(ds);
return ds;
} // CLOSE & DESTROY
}
答案 1 :(得分:1)
如何放入像
这样的Using语句 using(SqlConnection connection = new SqlConnection("connection string"))
{
connection.Open();
using(SqlCommand cmd = new SqlCommand("SELECT * FROM SomeTable", connection))
{
using (SqlDataReader reader = cmd.ExecuteReader())
{
if (reader != null)
{
while (reader.Read())
{
//do something
}
}
} // reader closed and disposed up here
} // command disposed here
} //connection closed and disposed here
答案 2 :(得分:0)
在finally子句中使用此
if (readerObj.IsClosed == false)
{
readerObj.Close();
}
答案 3 :(得分:0)
我认为你还应该在返回数据集之前处理命令对象。
在con.close()
之后尝试cmd.Dispose()