Я не работал с libpq-fe (postgresql-9.1.3)
PGresult * pg_res;
char * sql = "INSERT INTO tbGroups (Group_UID, Full_Name, User_UID) VALUES ($1, $2, $3);";
int group_uid = 11;
int user_uid = 1;
const char * name = "TEST1";
const char * values[3] = {(const char *) &group_uid, name, (const char *) &user_uid};
int lengths[3] = {sizeof(group_uid), strlen(name), sizeof(user_uid)};
int format[3] = {1, 1, 1};
pg_res = PQprepare(conn, "insert_tbgroups", sql, 3, NULL);
PQclear(pg_res);
pg_res = PQexecPrepared(conn, "insert_tbgroups", 3, values, lengths, format, 1);
PQclear(pg_res);
Работает, но результат:
rcpdv=# select group_uid, full_name, user_uid from tbGroups; group_uid | full_name | user_uid -----------+---------------+---------- 184549376 | TEST1 | 16777216 (1 rows)
Каков правильный способ привязки числовых значений к подготовленному sql, без param_types?
PostgreSQL ожидает, что данные попадут в сетевое соединение. Таким образом, вам нужно преобразовать свои числовые данные в сетевой формат (big endian). Обычно я использую функции ntohl()
для грубого примера в вашем случае:
int format[3] = {1, 1, 1};
for (i = 0; i < 3; ++i) {
format[i] = ntohl(format[i]);
}