ExecuteReader需要一个开放且可用的连接。连接的当前状态为“打开”

时间:2018-07-24 19:58:56

标签: c# sql-server

这是我使用的代码:

  StringBuilder cmdTekst = new StringBuilder();
  SqlCommand cmd;
  cmd = Cnn.CreateCommand();
  cmd.Connection = Cnn;
  if (Cnn.State != ConnectionState.Open)
  {
    Cnn.Open();
  }
  cmd.CommandType = CommandType.Text;
  cmdTekst.AppendLine("SELECT * FROM tblNummering WHERE type = 1 AND EindPer IS NULL;");
  cmd.CommandText = cmdTekst.ToString();
  Log.Debug("sql tekst = '" + cmd.CommandText + "'");
  SqlDataReader reader = cmd.ExecuteReader();

代码已简化。

这是我得到的例外

“ ExecuteReader需要打开且可用的连接。连接的当前状态为“打开”。

据我所知连接可用并打开。

我无法切换为使用。这将需要几天的重构。

在此连接之前,还要打开其他几个连接。 设置更高的连接数并不能解决问题。

有人知道如何解决此问题吗?

1 个答案:

答案 0 :(得分:2)

... and available Connection <=这也很重要。仅仅因为它是开放的并不意味着它尚未被另一个线程使用(例如)。解决方案是不重用数据库连接,这些类型应该是短暂的。根据需要创建它们,并在完成后立即处理它们。基础框架将为您处理连接池,因此尝试为应用程序进行连接池没有任何好处。

如果您无法处理全局连接,请在遇到这种竞争情况时创建一个新的连接。

using (var connection = new SqlConnection(Cnn.ConnectionString)) // use same connection string as your Global instance
using (var cmd = connection.CreateCommand())
{
  cmd.CommandType = CommandType.Text;
  cmd.CommandText = "SELECT * FROM tblNummering WHERE type = 1 AND EindPer IS NULL;"
  connection.Open();
  using(SqlDataReader reader = cmd.ExecuteReader())
  {
    while(reader.Read())
    {
      // fetch results
    }
  }
}