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 使用的所有这些都没有问题。附加问题,如何最好地从这样的简单查询或只有一个信息的“COUNT”中获得结果?在 npgsql 我使用“ExecuteScalar”函数。

4

1 回答 1

4

根据 postgresql 头文件,状态码 2PGRES_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 回答