我将 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
= 一个整数u->getID()
= 一个字符串conn
= 与数据库的连接
表“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
来存储用户和模式,唯一的区别是它们都有文本/xml 字段(模式上唯一的 int 字段是一个序列字段,我不存储它我自己的值(value)),但因为 user_patterns 是一个关系表,我需要为 pattern_id 存储和 int。
我已经阅读了 pqlib 的文档并看到了示例,两者都没有用。
最佳答案
问题出在以下几行:
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
关于c++ - C++中的PQexecParams,查询错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21560925/