C ++中的PQexecParams,查询错误

时间:2014-02-04 18:52:49

标签: c++ postgresql

我正在使用pqlib和postgresql版本9.1.11

我有以下代码

const char *spid = std::to_string(pid).c_str();
PGresult   *res;
const char *paramValues[2] = {u->getID().c_str(), spid};
std::string table;
table = table.append("public.\"").append(Constants::USER_PATTERNS_TABLE).append("\"");
std::string param_name_pid = Constants::RELATION_TABLE_PATTERN_ID;
std::string param_name_uid = Constants::RELATION_TABLE_USER_ID;
std::string command = Constants::INSERT_COMMAND + table + " (" + param_name_uid + ", " + param_name_pid + ")  VALUES ($1, $2::int)";
std::cout << "command: " << command << std::endl;
res = PQexecParams(conn, command.c_str(), 2, NULL, paramValues, NULL, NULL,0);

其中

  • INSERT_COMMAND =“INSERT INTO”(字符串)

  • USER_PATTERN_TABLE =“User_Patterns”(字符串)

  • RELATION_TABLE_PATTERN_ID =“pattern_id”(字符串)

  • RELATION_TABLE_USER_ID =“user_id”(字符串)

  • pid =一个int

  • u->getID() =一个字符串

  • conn =与db的连接

表“User_Patterns”定义为

CREATE TABLE "User_Patterns"(
    user_id    TEXT references public."User" (id) ON UPDATE CASCADE ON DELETE CASCADE
    ,pattern_id BIGSERIAL references public."Pattern" (id) ON UPDATE CASCADE
    ,CONSTRAINT user_patterns_pkey PRIMARY KEY (user_id,pattern_id)  -- explicit pk
)WITH (
    OIDS=FALSE
);

我已经有一个用户和一个模式加载到他们各自的表中。

生成的命令是:

INSERT INTO public."User_Patterns" (user_id, pattern_id)  VALUES ($1, $2::int)

我也试过了$2, $2::bigint, $2::int4

问题是:

我收到错误:

ERROR:  invalid input syntax for integer: "public.""

我已经使用PQexecParams来存储用户和模式,唯一的区别是它们都有text / xml字段(模式上唯一的int字段是序列字段,我自己不存储该值)但是因为user_patterns是一个关系表,我需要存储和int为pattern_id。

我已经阅读了pqlib的文档并看到了这些示例,两者都没用。

1 个答案:

答案 0 :(得分:1)

问题在于:

const char *spid = std::to_string(pid).c_str();
const char *paramValues[2] = {u->getID().c_str(), spid};

std::to_string(pid)创建临时字符串,.c_str()返回指向此字符串内部表示的指针,该字符串在行尾被销毁,从而导致死指针。您也可以看到问题的答案 stringstream::str copy lifetime