gpt4 book ai didi

c - 获取 libpq-fe 中字段的大小

转载 作者:太空宇宙 更新时间:2023-11-04 06:36:44 25 4
gpt4 key购买 nike

我正在使用 C 中的 libpq-fe 库来连接到 postgres 数据库。
我正在使用返回时间戳的 libpqfe 从我的代码中调用存储过程。
我想将这个时间戳存储到一个 char 数组中。但要这样做,我首先必须知道时间戳的大小,以便我可以声明数组。为了获得大小,我使用了 int PQfsize(PGresult *res, int field_index);。您可以找到更多相关信息 here .

它返回值 8。但实际上时间戳的大小(不带区域)是 19

为什么 PQfsize 返回错误值?

我知道时间戳的大小是恒定的,我可以直接声明一个数组,然后使用 PQgetvalue 检索值,但是如何为没有固定大小的字段声明数组。

如何从 PGresult 中检索一个字段并将其存储到任何变量中?

最佳答案

PQfsize 没有返回错误的值。

如果您运行下面的查询,您也会得到答案 8,因为在您的 Postgres 版本中,时间戳在内部存储为一个 8 字节(64 位)整数。

select typlen from pg_type where oid = 'timestamp'::regtype::oid;

根据您链接的文档,PQfsize 返回数据库元组中为该字段分配的空间,换句话说,服务器的数据类型二进制表示的大小。

PQgetlength 返回字段(属性)的字节长度。元组和字段索引从 0 开始。

这是特定数据值的实际数据长度,即 PQgetvalue 指向的对象的大小。请注意,对于 ASCII 表示的值,此大小与 PQfsize 报告的二进制大小无关。 .

为了声明没有固定大小的数组,您在创建数组之前使用PQgetlength 确定数组的大小。 (应该返回 19)并通过指定将数据作为文本获取 PQexecParamsresultFormat为 0。如果您只是使用 PQexec则默认以文本形式返回数据。

可以使用 libpq 的示例 here .

要修改这个例子,而不只是打印值,它会根据数据的长度创建一个字符数组,并将数据复制到数组中,您可以用类似的东西替换 for 循环

      for (i = 0; i < PQntuples(res); i++)                
{
int length = PQgetlength(res, i, 0);
char result[length];
printf("%s\n", PQgetvalue(res, i, 0));
strncpy (result,PQgetvalue(res, i, 0),length);
}

您还需要添加 #include <string.h>示例。

关于c - 获取 libpq-fe 中字段的大小,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14056894/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com