powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / libpq PQexecParams() integer-parameter binding problem
3 сообщений из 3, страница 1 из 1
libpq PQexecParams() integer-parameter binding problem
    #34492817
Ilya Storozhilov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Здраствуйте!
Неправильные бинарные данные передаются в SQL-запрос при использовании PQexecParams(). Вот код:

1. tbl__libpq_test.sql:

--------------------------------------------------------------------------------
CREATE TABLE tbl__libpq_test (id INTEGER, NAME VARCHAR);
--------------------------------------------------------------------------------

2. [myuser@myhost ~]$ psql < tbl__libpq_test.sql

3. libpq_test.c
--------------------------------------------------------------------------------
#include <postgres.h>
#include <libpq-fe.h>
#include <string.h>
#include <stdio.h>
#include <stdlib.h>

#define CONNECTION_STRING "..."
#define MAX_SQL_PARAMS_COUNT 48

static void
exit_nicely(PGconn *conn)
{
PQfinish(conn);
exit(1);
}

int
main(int argc, char **argv)
{
PGconn *conn;
PGresult *res;
const char *paramValues[MAX_SQL_PARAMS_COUNT];
int paramLengths[MAX_SQL_PARAMS_COUNT];
int paramFormats[MAX_SQL_PARAMS_COUNT];
conn = PQconnectdb(CONNECTION_STRING);
if (PQstatus(conn) != CONNECTION_OK)
{
fprintf(stderr, "Connection to database failed: %s", PQerrorMessage(conn));
exit_nicely(conn);
}
int32 id = 1;
char *name = "Foobar";
paramValues[0] = (char *) &id;
paramLengths[0] = sizeof(id);
paramFormats[0] = 1;
paramValues[1] = name;
paramLengths[1] = 0;
paramFormats[1] = 0;
res = PQexecParams(
conn,
"INSERT INTO tbl__libpq_test (id, name) VALUES ($1::integer, $2::varchar)",
2,
NULL,
paramValues,
paramLengths,
paramFormats,
0
);
if (PQresultStatus(res) != PGRES_COMMAND_OK)
{
fprintf(stderr, "INSERT failed: %s", PQerrorMessage(conn));
PQclear(res);
exit_nicely(conn);
}
PQclear(res);
PQfinish(conn);
return 0;
}
--------------------------------------------------------------------------------

4. build & execute program

5. Go to psql console

db__test=# select * from tbl__libpq_test;
id | name
----------+--------
16777216 | Foobar
(1 запись)

Итого имеем, что в поле id вместо 1-цы записалось некое 16777216... :( Я пробовал объявлять id с типом uint32_t (как написано в примерах в мануале http://www.postgresql.org/docs/8.2/static/libpq-example.html) - та же история. изменение SQL-запроса на "INSERT INTO tbl__libpq_test (id, name) VALUES ($1::int4, $2::varchar)" тоже ничего не дает. Подскажите, пожалуйста, где ошибка? Спасибо.
...
Рейтинг: 0 / 0
libpq PQexecParams() integer-parameter binding problem
    #34492898
Serik Akhmetov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ilya Storozhilov paramValues[0] = (char *) &id;
paramLengths[0] = sizeof(id);
paramFormats[0] = 1;
paramValues[1] = name;
paramLengths[1] = 0;
paramFormats[1] = 0;Я не стал заморачиваться и все параметры привожу к строке.
Код: plaintext
1.
2.
3.
4.
  const char *s   = itr->value.c_str();
  paramValues[i]  = (char*)s;
  paramLength[i]  = itr->value.Length();
  paramFormats[i] =  0 ;
  paramTypes[i]   =  0 ;
...
Рейтинг: 0 / 0
libpq PQexecParams() integer-parameter binding problem
    #34492948
ilejn
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ilya StorozhilovПодскажите, пожалуйста, где ошибка?

Я думаю, что в хостовом порядке байт.
man ntohl.
...
Рейтинг: 0 / 0
3 сообщений из 3, страница 1 из 1
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / libpq PQexecParams() integer-parameter binding problem
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]