Правильный способ привязки числовых значений к подготовленному SQL

0

Я не работал с 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?

Теги:

1 ответ

0
Лучший ответ

PostgreSQL ожидает, что данные попадут в сетевое соединение. Таким образом, вам нужно преобразовать свои числовые данные в сетевой формат (big endian). Обычно я использую функции ntohl() для грубого примера в вашем случае:

int format[3] = {1, 1, 1};

for (i = 0; i < 3; ++i) {
    format[i] = ntohl(format[i]);
}
  • 0
    Привет, спасибо ntohl работает с целочисленными значениями.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню