我收到一条错误消息: 超时已过。在从池中获取连接之前超时期限已过。这可能是因为所有池连接都在使用中并且已达到最大池大小。
我的代码:
clsDBConn dbConn = new clsDBConn();
SqlDataCommand CMD;
private void Recompute()
{
CMD = new SqlCommand("SELECT * FROM tblEmployee", dbConn.connection);
SqlDataReader EmplReader = CMD.ExecuteReader();
while (EmplReader.Read())
{
while(DateFrom >= DateTo)
{
//Some Reader
//Lots of SQL Command ExecuteNonQuery();
}
}
}
我阅读了有关此错误的一些解决方案。他们说我应该打开和关闭连接。 但问题是,如果连接关闭,我将无法访问我需要在我的 sql 命令中连接的读取器的值。
我正在循环 50 多名员工,每个员工计算时间记录(迟到、加类、加类等)
我该怎么办?
最佳答案
您需要处理
您的连接以便将它们返回到池中。完成类实例后,只需执行 dbConn.connection.Dispose()
。或者将连接的创建移动到您的方法并使用 using
:
using(var dbConn = new clsDBConn())
{
using(var CMD = new SqlCommand("SELECT * FROM tblEmployee", dbConn.connection))
{
using(SqlDataReader EmplReader = CMD.ExecuteReader())
{
while (EmplReader.Read())
{
while(DateFrom >= DateTo)
{
//Some Reader
//Lots of SQL Command ExecuteNonQuery();
}
}
}
}
}
请注意,您的类 clsDBConn
需要实现 IDisposable
并执行 connection.Dispose()
作为其实现,这样才能正常工作。
关于C# - 如何避免 SQL 命令循环中的最大连接池错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42020528/