C# 如何停止获取连接池错误

C# 如何停止获取连接池错误,c#,postgresql,C#,Postgresql,我经常遇到以下错误: Npgsql.NpgsqlException:'连接池已耗尽,请提升MaxPoolSize(当前为100)或超时(当前为15秒)' 然后我在这里寻找可能的原因和解决方案,发现我应该使用语句来应用。所以我检查了我所有的代码并做到了 然而,我在测试一个按钮时不断遇到这个错误,该按钮从我的数据库中获取信息,进行一些计算,并将结果写入几个文本框中。它通常在我第五次点击它时崩溃。下面是一段代码: private void CalcTemp(Cable cable)

我经常遇到以下错误:

Npgsql.NpgsqlException:'连接池已耗尽,请提升MaxPoolSize(当前为100)或超时(当前为15秒)'

然后我在这里寻找可能的原因和解决方案,发现我应该使用
语句来应用
。所以我检查了我所有的代码并做到了

然而,我在测试一个按钮时不断遇到这个错误,该按钮从我的数据库中获取信息,进行一些计算,并将结果写入几个文本框中。它通常在我第五次点击它时崩溃。下面是一段代码:

        private void CalcTemp(Cable cable)
        {
            string sqlString = "Server=172.19.2.40; Port=5432; User Id=postgres; Password=password; Database=PROLIG;";
            using (NpgsqlConnection sqlCon = new NpgsqlConnection(sqlString))
            {
                string cmdString = @"SELECT tempamb, elevmaxonan, elevmaxonaf, elevmaxonaf2, topoil1_2, topoil1_4, especial1factor, especial1topoil,
                                especial2factor, especial2topoil, especial3factor, especial3topoil, especial4factor, especial4topoil, 
                                especial5factor, especial5topoil, especial6factor, especial6topoil FROM correntes WHERE prolig_ofs_id = @id;";
                NpgsqlCommand sqlCmd = new NpgsqlCommand(cmdString, sqlCon);
                sqlCmd.Parameters.AddWithValue("id", StartOF.MyOF.id);
                NpgsqlDataAdapter sqlDa = new NpgsqlDataAdapter(sqlCmd);
                DataTable dt = new DataTable();
                sqlDa.Fill(dt);

                //does calculation

             }
有没有想过为什么会发生这种情况以及如何解决


非常感谢

只需将using添加到命令创建中:

using (NpgsqlCommand sqlCmd = new NpgsqlCommand(cmdString, sqlCon)) 
{
处理所有实现IDisposable的对象是一个很好的实践。 由于您的命令没有及时释放,因此您的连接不会关闭并返回到池中。 dispose上有很多东西必须直接执行(或使用)

因此,您需要以下代码:

private void CalcTemp(Cable cable)
{
    string sqlString = "Server=172.19.2.40; Port=5432; User Id=postgres; Password=password; Database=PROLIG;";
    using (NpgsqlConnection sqlCon = new NpgsqlConnection(sqlString))
    {
        string cmdString = @"SELECT * FROM correntes WHERE prolig_ofs_id = @id;";
        using (NpgsqlCommand sqlCmd = new NpgsqlCommand(cmdString, sqlCon))
        {
            sqlCmd.Parameters.AddWithValue("id", StartOF.MyOF.id);
            NpgsqlDataAdapter sqlDa = new NpgsqlDataAdapter(sqlCmd);
            DataTable dt = new DataTable();
            sqlDa.Fill(dt);    
            //does calculation
        } //end using command (calls dispose on command, even if exception happens)
    } //end using connection (calls dispose on connection object, even if exception happens)
}

下一个建议-如果数据量很大,不要使用数据表。改用DataReader。

只需将using添加到命令创建中:

using (NpgsqlCommand sqlCmd = new NpgsqlCommand(cmdString, sqlCon)) 
{
处理所有实现IDisposable的对象是一个很好的实践。 由于您的命令没有及时释放,因此您的连接不会关闭并返回到池中。 dispose上有很多东西必须直接执行(或使用)

因此,您需要以下代码:

private void CalcTemp(Cable cable)
{
    string sqlString = "Server=172.19.2.40; Port=5432; User Id=postgres; Password=password; Database=PROLIG;";
    using (NpgsqlConnection sqlCon = new NpgsqlConnection(sqlString))
    {
        string cmdString = @"SELECT * FROM correntes WHERE prolig_ofs_id = @id;";
        using (NpgsqlCommand sqlCmd = new NpgsqlCommand(cmdString, sqlCon))
        {
            sqlCmd.Parameters.AddWithValue("id", StartOF.MyOF.id);
            NpgsqlDataAdapter sqlDa = new NpgsqlDataAdapter(sqlCmd);
            DataTable dt = new DataTable();
            sqlDa.Fill(dt);    
            //does calculation
        } //end using command (calls dispose on command, even if exception happens)
    } //end using connection (calls dispose on connection object, even if exception happens)
}

下一个建议-如果数据量很大,不要使用数据表。请改用DataReader。

谢谢您的回答。那么,你是说我必须使用两个
using
语句,一个用于连接,一个用于命令?我的代码将位于这两个花括号内?请查看我的更新答案,同时避免创建/打开大量连接-这可能会降低应用程序的性能。这类事情的一个常见模式是:创建一个一次性对象,该对象上有一个连接-创建一次,进行所有计算并处理(需要时关闭连接),感谢您的回答。那么,你是说我必须使用两个
using
语句,一个用于连接,一个用于命令?我的代码将位于这两个花括号内?请查看我的更新答案,同时避免创建/打开大量连接-这可能会降低应用程序的性能。这类事情的一个常见模式是:创建一个一次性对象,该对象上有一个连接-创建一次,进行所有计算并处理(需要时关闭连接)