C# - 如何避免 SQL 命令循环中的最大连接池错误

标签 c# ado.net

我收到一条错误消息: 超时已过。在从池中获取连接之前超时期限已过。这可能是因为所有池连接都在使用中并且已达到最大池大小。

我的代码:

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/

相关文章:

c# - 在文本框输入方面需要帮助

c# - 转义 sql 字符串的简单方法?

sql - ADO.NET Command.CommandText属性中可以有多个SQL指令吗?

c# - 为什么模运算的结果不能直接用在 if 语句中?

c# - 无法使用 C# 复制文件

c# - 控制 Windows 窗体中多个线程之间的同步

c# - 动态创建 UI 和数据库,最好的方法是什么?

c# - 从参数化的 sql 查询中获取 SQL 语句

asp.net - .Net ADO 连接类

c# - 在 Entity Framework 中查找或创建对象