C# Npg sql проверка соединения Exception Throw System.NullReferenceException 'Ссылка на объект не установлена ​​для экземпляра объекта.' - PullRequest
0 голосов
/ 02 мая 2020


Мой код пытается проверить, является ли сервер PostgreSQL работающим и доступным по заданным учетным данным для данной базы данных. Используйте Npg sql NuGet. Если все данные, а также IP, порт, пользователь, пароль и база данных верны, код возвращает значение true.
Вот код:

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-адрес, на котором не работает сервер, или неверный порт, или неправильный пользователь / пароль, база данных, я всегда получаю:

pg_connetion.Open();

Ошибка:

Система .NullReferenceException: 'Ссылка на объект не установлена ​​для экземпляра объекта.'

Проблема в том, что catch (Exception) не перехватывает эту ошибку и возвращает простое false. Мне не нужно иметь дело с типом ошибок, таких как неверные учетные данные или IP / порт, просто нужно иметь значение true при успешном подключении к серверу PostgreSQL и false в любом другом случае.
Как бороться с этой ошибкой ?

enter image description here

1 Ответ

1 голос
/ 02 мая 2020

Чтобы получить сведения об исключении, вам нужно выполнить catch (Exception ex), а в блоке catch вы можете выполнить ex.InnerException или ex.Message, чтобы найти сведения об исключении. В вашем случае объект подключения является нулевым из-за неверных параметров. Я бы сделал нулевую проверку объекта подключения перед connection.open (), что позволило бы избежать установки объекта ref в экземпляр. Надеюсь, этого должно хватить. Измените свой код на следующий и отправьте мне значения 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;
        }
    }
}

``

enter image description here

...