我知道可能有很多,但是经过几天的搜索,我找不到如何在Linux下从C到PostgreSQL一次简单地传递integer
和char
的方法
在PHP中,它很容易,例如123,而在C中使用libpq
似乎很不寻常。
我看过PQexecParams
,但似乎无济于事。网上的例子也无济于事,这似乎是不可能的任务。
有人会友好地将这个简单的PHP语句转换为C,并向我展示如何在一个INSERT
查询中传递多个不同类型的var。
col1 is INT
col2 is CHAR
$int1 = 1;
$char1 = 'text';
$query = "INSERT INTO table (col1, col2) values ('$int1',$char1)";
$result = ibase_query($query);
这将显示我正在尝试做的事情(请注意代码非常错误):
void insert_CommsDb(PGconn *conn, PGresult *pgres, int csrv0) { const char * params[1];
params[0] = csrv0;
pgres = PQexecParams(conn, "INSERT INTO comms_db (srv0::int) values ($1)",
1,
NULL,
params,
1,
NULL,
0);
if (PQresultStatus(pgres) != PGRES_COMMAND_OK)
{
fprintf(stderr, "INSERT failed: %s", PQerrorMessage(conn));
exit_nicely(conn,pgres);
}
PQclear(pgres);
}
答案 0 :(得分:1)
https://www.postgresql.org/docs/current/static/libpq-exec.html
@joop在上面评论: 如果paramTypes参数为NULL,则所有参数均假定为字符串。 因此,您应该将int参数转换为字符串。
void insert_CommsDb(PGconn *conn, int csrv0)
{
PGresult *pgres;
char * params[1];
char buff[12];
sprintf(buff, "%d", csrv0);
params[0] = buff;
pgres = PQexecParams(conn
, "INSERT INTO comms_db (srv0::int) values ($1)" // The query (we dont need the cast here)
, 1 // number of params
, NULL // array with types, or NULL
, params // array with parameter values
, NULL // ARRAY with parameter lenghts
, NULL // array with per-param flags indicating binary/non binary
, 0 // set to 1 if we want BINARY results, 0 for txt
);
if (PQrresultStatus(pgres) != PGRES_COMMAND_OK)
{
fprintf(stderr, "INSERT failed: %s", PQerrorMessage(conn));
exit_nicely(conn,pgres);
}
PQclear(pgres);
}
答案 1 :(得分:0)
wildplasser的回答大致说明了方法。
由于您明确询问了几个参数,因此我将为其添加示例。
如果您不愿意将整数转换为字符串,则可以选择使用相关数据类型的外部二进制格式。这需要内部知识,并且可能需要阅读PostgreSQL源代码。对于某些数据类型,它也可能取决于硬件。
PGresult *res;
PGconn *conn;
Oid types[2];
char * values[2];
int lengths[2], formats[2];
int arg0;
/* connect to the database */
/*
* The first argument is in binary format.
* Apart from having to use the "external binary
* format" for the data, we have to specify
* type and length.
*/
arg0 = htonl(42); /* external binary format: network byte order */
types[0] = 23; /* OID of "int4" */
values[0] = (char *) &arg0;
lengths[0] = sizeof(int);
formats[0] = 1;
/* second argument is in text format */
types[1] = 0;
values[1] = "something";
lengths[1] = 0;
formats[1] = 0;
res = PQexecParams(
conn,
"INSERT INTO mytab (col1, col2) values ($1, $2)",
2,
types,
(const char * const *)values,
lengths,
formats,
0 /* results in text format */
);
我建议您将文本格式用于大多数数据类型。
值得注意的例外是bytea
,使用二进制格式通常是一个优点,因为它可以节省空间和CPU功耗。在这种情况下,外部二进制格式就是字节。
答案 2 :(得分:0)
VS C ++不喜欢htonl(42):
arg0 = htonl(42); / *外部二进制格式:网络字节顺序* /