已经打开的数据读取器的连接字符串中出现问题

本文关键字:字符串 问题 连接 读取 数据 | 更新日期: 2023-09-27 18:18:04

已经有一个与此命令关联的打开的 DataReader 必须先关闭。

当同一个人同时在不同的系统上打开同一页面时,我遇到了这个问题。我对此进行了大量搜索,但没有找到成功的解决方案。

我累了:

  1. 连接字符串中的MultipleActiveResultSets = true
  2. 增加连接等待时间
  3. 已验证所有连接是否已关闭

仅当创建上述条件时,才会出现此问题。请让我知道真正有效的解决方案

这是我正在使用的连接功能

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((