PostgreSQL, вставка поплавков с помощью libpq - PullRequest
0 голосов
/ 03 марта 2012

Я создал строку вставки со смешанными данными в C и не могу вставить строки.
Как я вижу, проблема может быть в числах с плавающей запятой, которые в моей локали используют запятую в качестве десятичного разделителя.

Итак, при вставке я получаю сообщение об ошибке:

ОШИБКА: INSERT имеет больше выражений, чем целевых столбцов
ЛИНИЯ 1: ... 0: 11: 37.097203 +0100 ',' Книга о решении проблем ',' ', PCS', 0,000000)

Код для вставки:

 snprintf(sqlInsert, sizeof(sqlInsert), "INSERT INTO mytable (dtbl_id, kni, dtmp, iname, tagname, mea, klc) VALUES 
 (%d, '%s', '%s', '%s', '%s', '%s', %f)", o, k, dt, es, tagname, meas)), IL.klc);

Как решить эту ситуацию, чтобы правильно вставить числа двойной точности?

1 Ответ

1 голос
/ 03 марта 2012
rc = snprintf(sqlInsert, sizeof sqlInsert
, "INSERT INTO mytable (dtbl_id, kni, dtmp, iname, tagname, mea, klc)"
" VALUES               (%d,     '%s', '%s', '%s',  '%s',   '%s', %f);"
                       , o,      k,    dt,   es, tagname, meas, IL.klc);

ОБНОВЛЕНИЕ: если есть проблемы с локалью, setlocale () может помочь вам установить локальный внутри вашей программы. LC_ALL = POSIX (или C) всегда должен присутствовать. (вполне может быть, что один из форматов {% e% f% g} нечувствителен к настройкам локали)

Следующая программа демонстрирует использование setlocale ():

#include <stdio.h>
#include <locale.h>

#pragma DONT define DEFAULT_LOCALE "POSIX"
#define DEFAULT_LOCALE "nl_NL.utf8"
/* LC_NUMERIC LC_ALL */

int main(int argc, char **argv)
{
    double val;
    char *old, *new;

    val = 1024 * 1024;
    val /= 10;

    printf ("Original: Val=%f\n", val);
    new = argv[1] ? argv[1] : DEFAULT_LOCALE ;

    old = setlocale (LC_ALL, new );

    printf("Old=%s, New=%s\n", old, new );
    printf ("After change: Val=%f\n", val);

    new = setlocale (LC_ALL, old );

    printf("Old=%s, New=%s\n", new,  old);
    printf ("After restore: Val=%f\n", val);
return 0;
}

Выход:

plasser@pisbak:./a.out
Original: Val=104857.600000
Old=nl_NL.utf8, New=nl_NL.utf8
After change: Val=104857,600000
Old=nl_NL.utf8, New=nl_NL.utf8
After restore: Val=104857,600000
plasser@pisbak:

После прочтения руководств я ожидал, что setlocale () вернет старую настройку, но, похоже, это не так. Может быть, я случайно изменил некоторые глобальные настройки: - [

ОБНОВЛЕНИЕ: всегда полезно явным образом приводить аргументы к * printf () функциям.

#include <locale.h>
(void) setlocale (LC_NUMERIC, "POSIX" );

rc = snprintf(sqlInsert, sizeof sqlInsert
, "INSERT INTO mytable (dtbl_id, kni, dtmp, iname, tagname, mea, klc)"
" VALUES               (%d,   '%s', '%s', '%s',   '%s',  '%s', %f);"
                  , (int) o,     k,   dt,   es, tagname, meas, (double) IL.klc);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...