这是我使用的代码:
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需要打开且可用的连接。连接的当前状态为“打开”。
据我所知连接可用并打开。
我无法切换为使用。这将需要几天的重构。
在此连接之前,还要打开其他几个连接。 设置更高的连接数并不能解决问题。
有人知道如何解决此问题吗?
答案 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
}
}
}