我正在使用PostgreSQL C API。读取documentation时,它说明当PQgetResult返回NULL并且PQisBusy不返回0时,PQgetResult将阻塞,查询完成。但是,如果没有更多输入,PQisBusy将返回1,因此我无法调用PQgetResult并获取NULL。因此,我不知道查询是否结束。还有其他方法可以知道查询是否完成吗?我是否误解了异步API?

- - 编辑 - - -

作为C代码的基本思想是:

PQsendQuery(conn, query)

while(true)
{
    PQconsumeInput(conn)
    if(PQisBusy(conn) == 0)
    {
        PGresult* res = PQgetResult(conn);
        if(res)
        {
            //print result
        }
        else
        {
            //res == NULL
            //indicates query is over
            break;
        }
    }
}

结果将被打印,但是循环永远不会终止。因为PQisBusy仅返回0一次。

最佳答案

我认为您需要的是PQsetSingleRowMode,让PQgetResult每次都返回一行。

来自http://www.postgresql.org/docs/9.2/static/libpq-single-row-mode.html



查看示例代码:
https://github.com/markokr/libpq-rowproc-demos/blob/master/demo-onerow-async.c

关于sql - Postgres异步API检测查询结束,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/13663151/

10-13 06:31