Проверьте, существует ли таблица PostgreSQL с Npgsql

До сих пор я не вижу различия в использовании водителя Npgsql вместо ODBC, работая с базой данных PostgreSQL по окнам. Но теперь я нахожу тот.

У меня есть такой код, чтобы проверить, существует ли стол с ODBC:

Public Function dbTableExists(ByVal dbTable As String, ByVal dbName As String) As Boolean

    Dim retval As Boolean = False
    Dim nCon As New OdbcConnection
    Dim btCommand As OdbcCommand = Nothing
    nCon.ConnectionString = "Dsn=" + dbDsn + _
                            ";database=" + dbName & _
                            ";server=" + dbServer + _
                            ";port=" + dbPort + _
                            ";uid=" + dbUser + _
                            ";pwd=" + dbPass
    Try
        nCon.Open()
        btCommand = New OdbcCommand("SELECT 1 FROM pg_tables WHERE tablename='" & dbTable + "'", nCon)
        retval = CBool(btCommand.ExecuteNonQuery())

    Catch ex As Exception
        MsgBox(ex.Message, MsgBoxStyle.Critical)
        retval = False
    End Try

    Return retval
End Function

С этим кодом я становлюсь Верным, если определенный стол существует в решительной базе данных или Ложный иначе.
То, когда я пытаюсь использовать Npgsql вместо функции ODBC, очень похоже:

Public Function tExists(ByVal dbTable As String, ByVal dbName As String) As Boolean

    Dim retval As Boolean = False
    Dim btCommand As NpgsqlCommand = Nothing
    Dim nCon As New NpgsqlConnection(String.Format( _
                    "Server={0};Port={1};User Id={2};Password={3};Database={4};", _
                    dbServer, dbPort, dbUser, dbPass, dbName))
    Try
        nCon.Open()
        btCommand = New NpgsqlCommand("SELECT 1 FROM pg_tables WHERE tablename='" & dbTable + "'", nCon)
        retval = CBool(btCommand.ExecuteNonQuery())

    Catch ex As Exception
        MsgBox(ex.Message, MsgBoxStyle.Critical)
        retval = False
    End Try

    Return retval
End Function

Но это не будет работать как ожидалось.
Я всегда становлюсь Верным как результат, неважно, если определенный стол присутствует или нет.

Какая-либо идея, как заставить функцию Npgsql работать?

0
Почему вы используете executeNonQuery() ? Вы являетесь управлением вопросом, таким образом, shouldn' t вы использовать executeQuery() (или что-то подобное - я don' t знают.Net),
добавлено автор a_horse_with_no_name, источник
Привет "имя". Ваша логика превосходна как обычно. По некоторым причинам MS ODBC return' s ценность вопроса с executeNonQuery, но Npgsql неожиданно don' t. Я didn' t знают для того различия до настоящего времени. Но вот ExecuteScalar, которые возвращают первый ряд или ценность (такой отчасти) вопрос. И такой, с ExecuteScalar я добираюсь, ожидаемый результат показал вопрос, и заставьте мою функцию Npgsql работать. Спасибо за обращение меня к правильному направлению.
добавлено автор Wine Too, источник
Вы могли включать это как пример? Я был бы счастлив к upvote.
добавлено автор Chris Travers, источник
метод с работой information_schema?
добавлено автор Tobia Zambon, источник

1 ответы

Я не знаю, не хотите ли вы/можете, изменяют ваш вопрос, но я предлагаю, чтобы вы использовали information_schema , стол вместо того, чтобы использовать pg_tables . Я лично использую этот метод:

 public override bool TableExists(string tableName)
    {
        string sql = "SELECT * FROM information_schema.tables WHERE table_name = '" + tableName + "'";
        using (var con = new NpgsqlConnection(preparedConnectionString))
        {
            using (var cmd = new NpgsqlCommand(sql))
            {
                if (cmd.Connection == null)
                    cmd.Connection = con;
                if (cmd.Connection.State != ConnectionState.Open)
                    cmd.Connection.Open();

                lock (cmd)
                {
                    using (NpgsqlDataReader rdr = cmd.ExecuteReader())
                    {
                        try
                        {
                            if (rdr != null && rdr.HasRows)
                                return true;
                            return false;
                        }
                        catch (Exception)
                        {
                            return false;
                        }
                    }
                }
            }
        }
    }

(Не заботьтесь об инъекции или подобный),

1
добавлено
pgsql – PostgreSQL
pgsql – PostgreSQL
2 429 участник(ов)

Чат про PostgreSQL

DBA - русскоговорящее сообщество
DBA - русскоговорящее сообщество
1 345 участник(ов)

Общаемся и обсуждаем темы, посвященные DBA, PostgreSQL, Redis, MongoDB, MySQL, neo4j, riak и т.д. См. также: @devops_ru, @kubernetes_ru, @docker_ru, @nodejs_ru Рекомендуем сразу отключить уведомления, чтобы пребывание здесь было полезным и комфортным.