Этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
Политика конфиденциальности
|
|
|
libpq PQexecParams() integer-parameter binding problem
|
|||
|---|---|---|---|
|
#18+
Здраствуйте! Неправильные бинарные данные передаются в 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)" тоже ничего не дает. Подскажите, пожалуйста, где ошибка? Спасибо. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.04.2007, 13:36 |
|
||
|
libpq PQexecParams() integer-parameter binding problem
|
|||
|---|---|---|---|
|
#18+
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. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.04.2007, 13:57 |
|
||
|
|

start [/forum/topic.php?fid=53&gotonew=1&tid=2005501]: |
0ms |
get settings: |
9ms |
get forum list: |
15ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
84ms |
get topic data: |
11ms |
get first new msg: |
6ms |
get forum data: |
3ms |
get page messages: |
46ms |
get tp. blocked users: |
1ms |
| others: | 265ms |
| total: | 446ms |

| 0 / 0 |
