2015-09-05 38 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,你是對的。有人已經在上面發佈了一些異常代碼。 –

相關問題