2015-09-05 32 views
4

我想从我的C#应用​​程序连接到数据库PostgreSQL像这样:Npgsql:是服务器关闭还是密码错误?

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 
} 

的问题是:

  1. 服务器IP /端口号:NpgsqlException.code不下列条件区分是错误的
  2. 用户名和密码组合是错误的

代码“28P01”在两种情况下都会返回。显然Npgsql可以看到服务器在那里,并且响应一些表示不良用户名或密码(上述条件#2)或没有人似乎在那里(条件#1)的数据

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

+0

你可以尝试手动打开TCP连接... –

+0

是的,但那只会告诉我有什么东西在监听端口。我不会告诉我什么在听。例如那里可能有MySQL数据库! –

回答

2

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

+1

嵌入长数字错误代码是一种确定的方法,可以知道你做错了什么。如果IP存在并且端口错误,您将得到一个SocketErrorCode等于SocketError.ConnectionRefused的SocketException(请参阅测试https://github.com/npgsql/npgsql/blob/develop/test/Npgsql.Tests/ConnectionTests.cs #L137)。如果在给定的IP上没有服务器,那么连接尝试一般会超时,抛出一个TimeoutException(参见测试https://github.com/npgsql/npgsql/blob/develop/test/Npgsql.Tests/ConnectionTests.cs #L243)。 –

+0

相关知识,谢谢。 – docesam

1

您可能正在使用Npgsql 2.x;新的Npgsql 3.x仅当从PostgreSQL服务器收到错误时才抛出NpgsqlException。网络连接错误引发为SocketException等。鼓励您进行升级。顺便说一下:即使使用Npgql 2.x,连接到错误的端口或错误的IP导致出现NpgsqlException,而Code是空字符串,而不是28P01,所以我无法重现您的确切结果。

+0

我在一个月前开始我的项目时使用了Npgsql 2。现在我正在使用Npgsql v 3.0.1.0,如visual studio –

+2

您确定没有PostgreSQL在您的主机和端口上侦听? Npgsql不只是用代码28P01 ... –

+0

来制造NpgsqlExceptions,你是对的。有人已经在上面发布了一些异常代码。 –

相关问题