Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/266.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# NpgsqlConnection.Open即使在没有internet的情况下也会打开远程连接_C#_Postgresql_State_Npgsql - Fatal编程技术网

C# NpgsqlConnection.Open即使在没有internet的情况下也会打开远程连接

C# NpgsqlConnection.Open即使在没有internet的情况下也会打开远程连接,c#,postgresql,state,npgsql,C#,Postgresql,State,Npgsql,这是我在这里的第一个问题 所以我有一个应用程序,它使用Npgsql库连接到远程数据库。 我有一个方法连接到数据库,执行查询,最后关闭连接。 它工作正常,但问题是,如果在程序运行但不调用该方法时,我断开WiFi以模拟无法连接到服务器,然后运行该方法,则连接方法仍然能够打开连接。这会导致查询被卡住。 我似乎找不到检查是否可以连接到服务器的方法,因为即使断开internet连接,NpgsqlConnection.Open()方法仍然会打开它 对不起,我的英语不好 public static Npgs

这是我在这里的第一个问题

所以我有一个应用程序,它使用Npgsql库连接到远程数据库。 我有一个方法连接到数据库,执行查询,最后关闭连接。 它工作正常,但问题是,如果在程序运行但不调用该方法时,我断开WiFi以模拟无法连接到服务器,然后运行该方法,则连接方法仍然能够打开连接。这会导致查询被卡住。 我似乎找不到检查是否可以连接到服务器的方法,因为即使断开internet连接,NpgsqlConnection.Open()方法仍然会打开它

对不起,我的英语不好

 public static NpgsqlConnection ConnectRemote()
    {
        try
        {
            remoteConnection = new NpgsqlConnection("Server = " + remoteData.server + "; " +
                                              "Port = " + remoteData.port + "; " +
                                              "User Id = " + remoteData.user + "; " +
                                              "Password = " + remoteData.password + "; " +
                                              "Database = " + remoteData.dataBase + "; ");

            remoteConnection.Open();
        }
        catch (NpgsqlException ex)
        {
            throw;
        }
        catch (Exception ex)
        {
            remoteConnection.Close();
            remoteConnection = null;
        }
        return remoteConnection;

    }

public static bool CheckRemote()
    {
            if (remoteConnection != null)
            {
                if (remoteConnection.FullState.Equals(ConnectionState.Open))
                    return true;
                return false;
            }
            return false;
    }

public bool AddNewProduct(Product product)
    {
        try
        {
            DBManager.ConnectLocal();
            DBManager.ConnectRemote();
            object[] parameters;

            if (DBManager.CheckRemote())
            {
                if (!DBManager.isSyncronized)
                {
                    DBManager.Syncronize();
                }

                parameters = new object[8];
                parameters[0] = 1;
                parameters[1] = product.id;
                parameters[2] = product.description;
                parameters[3] = (decimal)product.salePrice;
                parameters[4] = (decimal)product.cost;
                parameters[5] = product.minStock;
                parameters[6] = product.providerName;
                parameters[7] = product.category;
                DBManager.RunFunction(DBManager.remoteConnection, DBProcedures.createProduct, parameters);
            }
            else
            {
                string sql = "select * from createproduct(1, " + product.id + ", '" + product.description + "', " + (decimal)product.salePrice + ", " 
                    + (decimal)product.cost + ", " + product.minStock + ", '" + product.providerName + "', '" + product.category + "'); ";
                parameters = new object[1];
                parameters[0] = sql;
                DBManager.RunFunction(DBManager.localConnection, "addsync", parameters);

                DBManager.isSyncronized = false;

            }

            parameters = new object[6];
            parameters[0] = product.description;
            parameters[1] = (decimal)product.salePrice;
            parameters[2] = (decimal)product.cost;
            parameters[3] = product.minStock;
            parameters[4] = product.providerName;
            parameters[5] = product.category;

            DataTable result = DBManager.RunFunction(DBManager.localConnection, DBProcedures.createProduct, parameters);
            DBManager.DisconnectLocal();
            DBManager.DisconnectRemote();
            return true;
        }
        catch (Npgsql.NpgsqlException ex)
        {
            return false;
        }           
    }
有几件事——一件无关,两件相关。我希望这些结合起来会有所帮助

  • 首先是无关的评论。
    NpgSqlStringBuilder
    类是一个很好的工具,可以帮助解开连接字符串的神秘面纱。我知道你的方法是有效的,但由于你必须进行编辑(我将在一分钟后建议),我发现它比导航
    String.Format
    要容易得多,就像查询参数比尝试通过向查询传递参数来
    String.Format
    更容易(更安全)一样。另外,在连接字符串中声明
    ApplicationName
    ,以帮助诊断服务器上到底发生了什么,就像您将在下一条注释中看到的那样

  • 如果您使用的是连接池,那么当连接关闭时,我认为它不是真正关闭的——甚至在数据库上也不是。如果你打开server admin,你就会明白我的意思——它有点悬在那里,等待重用。尝试在连接字符串中设置
    pooled=false
    ,以确保在关闭连接时确实关闭了连接

  • 如果这不起作用,请尝试一个简单的查询。在您不需要它的情况下,成本将是最低的,并且在您确实需要它的时候无疑会修复您的用例

  • 这三项建议都反映在这里:

    public static NpgsqlConnection ConnectRemote()
    {
        NpgsqlConnectionStringBuilder sb = new NpgsqlConnectionStringBuilder();
        sb.ApplicationName = "Connection Tester";
        sb.Host = remoteData.server;
        sb.Port = remoteData.port;
        sb.Username = remoteData.user;
        sb.Password = remoteData.password;
        sb.Database = remoteData.database;
        sb.Pooling = false;
    
        remoteConnection = new NpgsqlConnection(sb.ToString());
    
        try
        {
            remoteConnection.Open();
            NpgSqlCommand test = new NpgSqlCommand("select 1", remoteConnection);
            test.ExecuteScalar();
        }
        catch (NpgsqlException ex)
        {
           throw;
        }
        catch (Exception ex)
        {
           remoteConnection.Close();
           remoteConnection = null;
        }
        return remoteConnection;
    }
    

    您的问题并不完全清楚,但您可能只是看到连接池在工作。默认情况下,当您关闭一个连接时,Npgsql实际上会在内部保持它的打开状态。下次打开连接时,它将重用以前的连接,而不是打开新的连接-这对性能非常重要。因此,如果池中有一个连接,Open()实际上什么都不做,但是如果网络中断,查询将失败。