我正在使用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的文档并看到了这些示例,两者都没用。
答案 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