在已经打开的DataReader的连接字符串中出现问题

时间:2013-06-13 07:48:40

标签: c# asp.net sql-server connection-string

  

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

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

我累了:

    连接字符串中的
  1. MultipleActiveResultSets = true
  2. 增加连接等待时间
  3. 已验证所有连接已关闭
  4. 仅在创建上述条件时才会出现此问题。请告诉我真正有效的解决方案

    这是我使用的连接功能

    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;
    }
    

4 个答案:

答案 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()