繁体   English   中英

PostgreSQL - libpq - bytea 和 PQexecParams

[英]PostgreSQL - libpq - bytea and PQexecParams

在我的 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);

r1r2nullptr ,查询本身不返回错误。

如果我将paramValues[0]从十六进制值转换为“字节数组”,我会得到以 chars ‰PNG开头的数据。 在这种情况下,结果不是nullptr ,而是空字符串,这也是不正确的。

知道这段代码有什么问题吗?

问题是返回结果类型的类型

PGresult* res = PQexecParams(conn,
    q,
    1,            /* one param */
    NULL,         /* let the backend deduce param type */
    paramValues,
    paramLengths,
    paramFormats,
    0);  /* ask for text results */

结果应该是text (0)而不是binary (1)

作为输入,使用没有转义符号的字节数组。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM