已经打开的数据读取器的连接字符串中出现问题
本文关键字:字符串 问题 连接 读取 数据 | 更新日期: 2023-09-27 18:18:04
已经有一个与此命令关联的打开的 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;
}
以这种方式使用全局连接对象是一种致命的罪过。在WinForms应用程序中很糟糕(非常糟糕(,但在 ASP.NET 中是致命的。(正如你所发现的(
一次性物品(以及像连接这样的昂贵物品(的使用模式是
CREATE, OPEN, USE, CLOSE, DESTROY
存在连接池机制是为了更轻松地使用此模式。
相反,你试图反对它,你付出了后果。
您的代码应重写为
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
}
如何放入 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
在 finally 子句中使用这个
if (readerObj.IsClosed == false)
{
readerObj.Close();
}
我认为您还应该在返回数据集之前释放命令对象。
在 con.close(( 之后尝试 cmd.Dispose((