2

「C」から動作するプログラムがあります。テーブルが存在しない場合は作成します。

PGresult *result;
conn = PG_connect();
if (conn)
{
    if (!PG_begin(conn))
    {
        char strtable[512] = {0};
        sprintf(strtable, "%s", "CREATE TABLE IF NOT EXISTS mytable");
        strcat(strtable, " (setting TEXT, value TEXT, rez1 TEXT, rez2 TEXT)");
        result = PQexec(conn, strtable);
        if (PQresultStatus(result) != PGRES_COMMAND_OK)
        {
            printf("CREATE TABLE failed: %s\n", PQerrorMessage(conn));
            PQclear(result);
            exit_nicely(conn);
        }

        PQclear(result);
        PG_end(conn);
    }
}
PQfinish(conn);

つまり、正しく接続されています。
しかし、なぜ (地球上で) 同じコードと状況でこのクエリが機能しないのでしょうか?

sprintf(strtable, "%s%s", "SELECT 1 FROM pg_tables WHERE tablename=", "\'invli\'");

私は常に PQresultStatus(result) = 2 と PQerrorMessage(conn) をテキストなしで受け取ります!

問題なく npgsql から使用するものすべて。追加の質問ですが、このような単純なクエリ、または情報が 1 つしかない "COUNT" から結果を取得するにはどうすればよいですか? npgsql では、「ExecuteScalar」関数を使用します。

4

1 に答える 1

4

postgresql ヘッダー ファイルによると、ステータス コード 2 はPGRES_TUPLES_OK、「タプルを返すクエリ コマンドがバックエンドによって適切に実行されました。PGresult には結果のタプルが含まれています」という意味です。したがって、ここではエラーはありません。それどころか、クエリに対して戻るPGRES_COMMAND_OKのはSELECT奇妙です。

ドキュメントのステータス コードも参照してください ( http://www.postgresql.org/docs/current/static/libpq-exec.html ):

PGRES_COMMAND_OK データを返さないコマンドの正常終了。

PGRES_TUPLES_OK データを返すコマンド (SELECT や SHOW など) の正常終了。

于 2013-06-02T13:08:07.457 に答える