2015-09-05 2 views
4

Я пытаюсь подключиться к базе данных PostgreSQL из моего приложения C# так: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 
} 

вопрос: NpgsqlException.code не делает различий между следующими условиями:

  1. номер сервера IP/порт неправильно
  2. имя пользователя и пароль сочетание неправильно

код «28P01» возвращается в обоих случаях. очевидно, что Npgsql может видеть, что сервер присутствует и отвечает некоторыми данными, указывающими на неправильное имя пользователя или пароль (условие № 2 выше), или, похоже, там нет (условие № 1)

как я могу различать эти 2 случая в моем коде?

+0

вы можете попытаться вручную открыть TCP-соединение ... –

+0

yup, но это только скажет мне, что что-то слушает в этом порту. я бы не сказал, что слушает. например там может быть база данных MySQL! –

ответ

2

с Npgsql v 3.0.2.0 (не уверен в более старых версиях), если IP/hostname ошибочно Исключение с кодом = -2146233083 с броском. если однако IP/имя хоста правильно, но номер порта неверен Исключение с кодом = -2147467259 с броском. если IP/port правильный, но имя пользователя/пароль неверно, будет выбрано исключение NpgsqlException с кодом = «28P01».

+1

Внедрение длинных числовых кодов ошибок - это верный способ узнать, что вы делаете что-то неправильно. Если IP существует и порт неверен, вы получите SocketException с SocketErrorCode, равным SocketError.ConnectionRefused (см. Тест 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 выдает NpgsqlException только тогда, когда ошибки получены с сервера PostgreSQL. Ошибки сетевого подключения возникают как SocketException и т. Д. Вам рекомендуется обновить.

К слову: я не смог воспроизвести ваши точные данные даже при использовании Npgql 2.x, подключившись к неправильному порту или неправильному IP-адресу, в результате возникло исключение NpgsqlException, а Code - пустая строка, а не 28P01.

+0

Я использовал Npgsql 2, когда я начал свой проект месяц назад. теперь я использую Npgsql v 3.0.1.0, как указано visual studio –

+2

Вы уверены, что на вашем хосте и порту нет прослушивания PostgreSQL? Npgsql не просто производит NpgsqlExceptions с кодом 28P01 ... –

+0

вы правы. кто-то уже опубликовал некоторые коды исключений выше. –

Смежные вопросы