C# Npgsql 连接检查器异常抛出 System.NullReferenceException 'Object reference not set to an instance of an object.'

C# Npgsql connection checker Exception Throw System.NullReferenceException 'Object reference not set to an instance of an object.'


我的代码尝试检查是 PostgreSQL 服务器 运行 并且可以通过给定数据库的给定凭据访问。使用 Npgsql NuGet。如果所有数据,IP、端口、用户、密码和数据库都正确,则代码 returns 为真。
这是一个代码:

public Boolean InsertInToPGSQL()
        {
            var pg_con_string = "Server=" + sqlinsertserver + ";" + "Port=" + sqlinsertport + ";" + "Database=" + sqlinsertdatabase + ";" + "User ID=" + sqlinsertusername + ";" + "Password=" + sqlinsertpassword + ";";
            var pg_connetion = new NpgsqlConnection(pg_con_string);
            try
            {
                if (pg_connetion != null)
                {
                    pg_connetion.Open();
                    pg_connetion.Close();
                    return true;
                }
                else
                {

                    return false;
                }

            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
                return false;
            }
        }

问题是,如果我写的 IP 地址没有服务器 运行,或者端口错误,或者错误 user/pass,数据库,我总是收到:

pg_connetion.Open();

一个错误:

System.NullReferenceException: 'Object reference not set to an instance of an object.'

问题是 catch(异常)不会捕获此错误并且 returns 简单错误。 我不需要处理错误类型,例如错误的凭据或 IP / 端口,只需要在成功连接到 PostgreSQL 服务器时为 true,在任何其他情况下为 false。
如何处理这个错误?

要获取异常详细信息,您需要执行 catch(Exception ex) 并且在 catch 块中,您可以执行 ex.InnerException 或 ex.Message 来查找异常详细信息。在您的情况下,由于参数不正确,连接对象为空。我会在 connection.open() 之前对连接对象进行空检查,这将避免对象引用未设置为实例。希望这应该能满足您的需要。将您的代码更改为以下内容并将 ex.Message 和 ex.InnerException 值发送给我。

public static class Application
{

    public static void Main()
    {
        if (InsertInToPGSQL())
            Console.WriteLine("Connection successful");
        else
            Console.WriteLine("Connection failed");

        Console.ReadLine();
    }       


    public static Boolean InsertInToPGSQL()
    {
        var pg_con_string = "";
        var pg_connetion = new NpgsqlConnection(pg_con_string);
        try
        {
            if (pg_connetion != null)
            {
                pg_connetion.Open();
                pg_connetion.Close();
                return true;
            }
            else
            {
                return false;
            }
        }
        catch (Exception ex)
        {
            return false;
        }
    }
}

``

可能晚了,但对于像我一样对这个帖子有感觉的人来说,它可能很有用。

在更新 NpSql nuget 包之前,我遇到了同样的问题。我在 4.0.3,更新到 4.1.10。最后它解决了问题。