在部分中使用postgresql数据库

时间:2014-06-10 23:19:09

标签: c postgresql

我有一个由10条记录组成的数据库,我想把它分成两部分。作为初学者,我使用以下行:res = PQexec(conn," SELECT * FROM table_name LIMIT 5 OFFSET 0");并且它给出了正确的前5个条目,但我想使用PQexecParams做同样的事情,我可以让用户选择限制和偏移量。我在链接中找到了一个工作示例:http://timmurphy.org/2009/11/19/pqexecparams-example-postgresql-query-execution-with-parameters/并在我的程序中实现了相同的功能。虽然限制/偏移条目不是来自用户端(我稍后将使用scanf),但我的代码如下:

    #include <stdio.h>
    #include <stdlib.h>
    #include <libpq-fe.h>
    #include <string.h>

    int main()
    {
        PGconn *conn;
        PGresult *res;
        int nFields=0,row=0,col=0;
        int lim = htonl(5);
        int off = htonl(0);
        const char *paramValues[2] = {(char *)&lim, (char *)&off};
        int lengths[2] = {sizeof(lim), sizeof(off)};
        int binary[2] = {1, 1};

        conn = PQconnectdb("dbname=test1 host=localhost user=postgres password=XXX");

        if(PQstatus(conn) == CONNECTION_BAD) 
        {
            fprintf(stderr, "Connection to database \"%s\" failed.\n", PQerrorMessage(conn));
            fprintf(stderr, "%s", PQerrorMessage(conn));
        }

        res = PQexecParams(conn,
                            "SELECT * FROM table_name LIMIT=$1::int4 OFFSET=$2::int4",
                            2,       
                            NULL,   
                            paramValues,
                            lengths,   
                            binary,    
                            0);      

    // res = PQexec(conn, "SELECT * FROM table_name LIMIT 5 OFFSET 0");
        if((!res) || (PQresultStatus(res) != PGRES_TUPLES_OK))
        {
            fprintf(stderr, "SELECT command did not return tuples properly\n");
            PQclear(res);
        }

        for(row=0;row<PQntuples(res);row++)
        {
            printf("%s\n",PQgetvalue(res,row,1));
        }

        PQfinish(conn);

        return 0;
    }

每次我运行程序时,我都会收到注释&#34; SELECT命令没有正确返回元组&#34;没有任何编译或任何其他错误。

请建议一个可能的解决方案或我犯错的地方。作为一个新手,我也有一个问题是,是否总是需要将整数参数传递到PQexecParams的网络字节顺序?

0 个答案:

没有答案