【发布时间】:2020-11-28 15:55:38
【问题描述】:
在我的 C++ 代码中,我将 libpq 用于 PostgreSQL。
如果我直接使用PQexec 运行以下查询,我会得到正确的结果(1 | {{15,20},{78,96}})
WITH bar AS(
SELECT ST_FromGDALRaster(E'\\x89504e470d0a1a0a0000000d494844520000000200000002080000000057dd52f80000000e49444154089963e46765b11702000107006b50183daf0000000049454e44ae426082'::bytea) AS rast
)
SELECT (ST_DumpValues(rast)).*
FROM bar
或
WITH bar AS(
SELECT ST_FromGDALRaster('\x89504e470d0a1a0a0000000d494844520000000200000002080000000057dd52f80000000e49444154089963e46765b11702000107006b50183daf0000000049454e44ae426082'::bytea) AS rast
)
SELECT (ST_DumpValues(rast)).*
FROM bar
但是,当我这样做时:
const char* paramValues[1];
int paramLengths[1];
int paramFormats[1];
const char * q = R"(
WITH bar AS (
SELECT ST_FromGDALRaster($1::bytea) AS rast
)
SELECT (ST_DumpValues(rast)).*
FROM bar
)";
paramValues[0] = "\\x89504e470d0a1a0a0000000d494844520000000200000002080000000057dd52f80000000e49444154089963e46765b11702000107006b50183daf0000000049454e44ae426082";
paramLengths[0] = 72;
paramFormats[0] = 1; /* parameters are passed in a binary format */
PGresult* res = PQexecParams(conn,
q,
1, /* one param */
NULL, /* let the backend deduce param type */
paramValues,
paramLengths,
paramFormats,
1); /* ask for binary results */
auto r1 = PQgetvalue(res, 0, 0);
auto r2 = PQgetvalue(res, 0, 0);
值r1 和r2 是nullptr,查询本身不会返回错误。
如果我将 paramValues[0] 从十六进制值转换为“字节数组”,我会得到以字符 ‰PNG 开头的数据。在这种情况下,结果不是nullptr,而是空字符串,也不正确。
知道这段代码有什么问题吗?
【问题讨论】:
标签: c postgresql psql