PostgreSQL, libpq/C, параметры обновления

Я могу обновить запись в таблице с помощью манипуляций со строками, которые имеют некоторую слабость.
Итак, теперь я пытаюсь обновить с помощью параметров, но это не так, как я думал.

sprintf(sql, "%s%s%s%s%s%d%s",
    "UPDATE ", mytable, " SET ",
    "my_id=$0, mystr1=$1, mystr2=$2, myint=$3, mydouble=$4",
    "WHERE my_id='", local_my_id, "'");

const char *values[5] =
{local_my_id, local_mystr1, local_mystr2, local_myint, local_mydouble};

result = PQexecParams(conn, sql, 5, NULL, values,  NULL,  NULL, 0);

Значения 1 и 4 являются целыми числами, а значение 5 является двойным, что не помещается в массив const char.
Я пробую то же самое только со строками, и это работает.

Если мне нужно преобразовать числа в строки, которые не кажутся логичными.

Как это сделать правильно?


person Wine Too    schedule 05.06.2013    source источник


Ответы (1)


Преобразование чисел в строки может показаться нелогичным, но это именно то, что вы должны сделать, если используете «текстовый» протокол по умолчанию. Рассмотрите возможность использования библиотеки libpqtypes, которая позаботится обо многих деталях за вас.

Вы можете использовать бинарный протокол (параметр за параметром, см. документацию по PQexecParams)... но в целом вам лучше использовать текстовый протокол. Часто в сети это быстрее, особенно для большого количества небольших чисел, и вам не нужно беспокоиться о проблемах с порядком байтов и числовым форматом, если вы используете текстовый протокол.

person Craig Ringer    schedule 05.06.2013
comment
Я понимаю. В этой ситуации libpqtypes кажется весьма привлекательным. Я пытаюсь скомпилировать, но не могу. Есть ли здесь место для загрузки двоичных файлов Windows этой библиотеки? - person Wine Too; 05.06.2013
comment
@user973238 user973238 А, ты на Windows. Весело. Мне еще не приходилось работать с libpqtypes в Windows, так что там вы сами. Если вы ничего не нашли после подходящего поиска, подумайте о том, чтобы задать вопрос в списках рассылки или опубликовать новый вопрос SO. - person Craig Ringer; 06.06.2013