0

これまでのところ、Windows で PostgreSQL データベースを操作する場合、ODBC の代わりに Npgsql ドライバーを使用することに違いはありません。しかし今、私はそれを見つけました。

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

このコードでは、特定のテーブルが決定されたデータベースに存在する場合は True になり、そうでない場合は False になります。
ODBC関数の代わりにNpgsqlを使用しようとすると、非常に似ています:

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

しかし、これは期待どおりには機能しません。
特定のテーブルが存在するかどうかに関係なく、結果として常に True を取得します。

Npgsql関数を機能させる方法はありますか?

4

1 に答える 1

2

クエリを変更したくない/変更できないかどうかはわかりませんが、を使用する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;
                        }
                    }
                }
            }
        }
    }

(注射などは気にしないでください)

于 2013-07-15T09:32:20.090 に答える