Npgsql:是服务器关闭还是密码错误?

Npgsql : is the server down or a bad password?

我正在尝试从我的 C# 应用程序连接到 PostgreSQL 数据库,如下所示:

NpgsqlConnection MyConnection = new           
NpgsqlConnection("Server=localhost;Port=5432;User Id=postgres;Password=mypassword;Database=mydatabase;");
try
{
    MyConnection.Open();
}
catch (NpgsqlException pe)
{              
    //Code "28P01" = user name or password is wrong 
    // server ip or port  is wrong
}

问题是:NpgsqlException.code不区分以下情况:

  1. 服务器ip/端口号错误
  2. 用户名密码组合错误

两种情况都返回代码“28P01”。很明显,Npgsql 可以看到服务器在那里并响应一些数据,表明用户名或密码错误(上面的条件 #2)或者似乎没有人在那里(上面的条件 #1)

我如何区分代码中的这两种情况?

您可能正在使用 Npgsql 2.x;新的 Npgsql 3.x 只有在从 PostgreSQL 服务器接收到错误时才会抛出 NpgsqlException。网络连接错误被引发为 SocketException 等。我们鼓励您升级。

顺便说一句:即使使用 Npgql 2.x,我也无法重现您的确切发现,连接到错误的端口或错误的 IP 导致 NpgsqlException,代码为空字符串,而不是 28P01。

使用 Npgsql v 3.0.2.0(不确定旧版本)如果 IP/hostname 错误,将抛出代码 =-2146233083 的异常。但是,如果 IP/hostname 是正确的但端口号是错误的异常代码 = -2147467259 将被抛出。如果 IP/port 正确但用户名/密码错误,将抛出代码为“28P01”的 NpgsqlException。