C:libpq-fe尝试选择bigint(int8)

时间:2018-01-09 02:14:47

标签: c postgresql libpq

我正在尝试对postgres运行一个简单的查询,但我无法获得bigint列的值。 我尝试的所有内容都会返回0(零)或错误的值......

当我使用strtoll时,请返回0(零)

int64_t ret = -1;
ret = strtoll(v_c3_01, NULL, 10);

使用的测试代码是......

PGresult *res = PQexecParams(
                            conn, 
                            "SELECT c3_01::int8, c3_02::text FROM v_acs_3_01", 
                            0, NULL, NULL, NULL, NULL,
                            1);
int NC_c3_01 = PQfnumber(res, "c3_01");
int NC_c3_02 = PQfnumber(res, "c3_02");

for (int i = 0; i < PQntuples(res); i++)
{
    char *v_c3_01, *v_c3_02;        

    v_c3_01 = PQgetvalue(res, i, NC_c3_01);
    v_c3_02 = PQgetvalue(res, i, NC_c3_02);

    // Return 0(zero)
    int64_t tst1 = -1;
    tst1 = strtoll(v_c3_01, NULL, 10);

    printf("%s \t %ld \t %s\n", v_c3_01, tst1, v_c3_02);

}

如果有人已经为此通过,或者现在我做错了什么,请帮助我。

由于

解决

uint64_t uid = 0;
uid = be64toh(*(uint64_t*)(v_c3_01));
printf("%ld\n", uid);

1 个答案:

答案 0 :(得分:0)

您应该传递NULL而不是这些“非数组”。

the documentation说:

  

整数的二进制表示使用网络字节顺序(最重要的字节优先)。

因此,您应该使用pg_ntoh64中定义的include/port/pg_bswap.h宏。

但也许从结果集中提取数字的方式也存在错误;你没有显示那段代码。