PQprepare и PQexecPrepared Usage

Надеюсь, кто-то может помочь мне с использованием PQprepare и PQexecPrepared. Я уверен, что у меня что-то не так, но все, что я пытаюсь сделать, похоже, не работает.

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

ERROR: invalid input syntax for integer: "50.2000008"

Это значение для широты, которое я установил для Oid равным 701 (float8), но он говорит, что это целое число. Я что-то упускаю или что-то не так?

bool database::AddDataRow(int datasetid, string readingdatetime, float depth, float value, float latitude, float longitude) {
//data_plus

const char* stmtName = "PREPARE_DATA_PLUS_INSERT";
Oid oidTypes[6] = {23, 1114, 701, 701, 701, 701};
int paramFormats[6] = {0, 0, 0, 0, 0, 0};
PGresult* stmt = PQprepare(
conn,
stmtName,
"INSERT INTO data_plus(datasetid, readingdatetime, depth, value, uploaddatetime, longitude, latitude)""VALUES ($1, $2, $3, $4, NOW(), $5, $6);",
6,
(const Oid *) oidTypes
);

cout << PQresultErrorMessage(stmt) << " Test";

const char* paramValues[6];
int paramLengths[6];

paramValues[0] = lexical_cast<string>(datasetid).c_str();
paramValues[1] = readingdatetime.c_str();
paramValues[2] = lexical_cast<string>(depth).c_str();
paramValues[3] = lexical_cast<string>(value).c_str();
paramValues[4] = lexical_cast<string>(longitude).c_str();
paramValues[5] = lexical_cast<string>(latitude).c_str();

paramLengths[0] = strlen (paramValues[0]);
paramLengths[1] = strlen (paramValues[1]);
paramLengths[2] = strlen (paramValues[2]);
paramLengths[3] = strlen (paramValues[3]);
paramLengths[4] = strlen (paramValues[4]);
paramLengths[5] = strlen (paramValues[5]);

PGresult* test = PQexecPrepared(conn,
stmtName,
6,
paramValues,
paramLengths,
paramFormats,
0);

cout << PQresultErrorMessage(test);

PQclear(test);
PQclear(stmt);
}

\ d data_plus

                  View "public.data_plus"Column      |            Type             | Modifiers
-----------------+-----------------------------+-----------
id              | bigint                      |
datasetid       | integer                     |
readingdatetime | timestamp without time zone |
depth           | double precision            |
value           | double precision            |
uploaddatetime  | timestamp without time zone |
longitude       | double precision            |
latitude        | double precision            |

Спасибо,

отметка

3

Решение

Попробуйте передать нулевое значение для oidTypes и пусть сервер выводит типы данных.

В руководстве сказано:

Если paramTypes является NULLили любой конкретный элемент в массиве равен нулю, сервер назначает тип данных символу параметра таким же образом, как это делается для нетипизированной литеральной строки.

… и не должно быть никаких проблем, связанных с любым из этих типов, если таблица определена надлежащим образом.

Вы также можете пройти NULL за paramFormats поскольку по умолчанию предполагается, что все параметры являются текстовыми, а не двоичными.

paramLengths не используется или не требуется при использовании параметров текстового формата. Оставьте это как ноль. Это может быть причиной проблемы.

2

Другие решения

Вполне вероятно, что причина ошибки вовсе не в показанном коде, который сам по себе выглядит нормально.

data_plus это не таблица, это представление в соответствии с выводом первой строки \d data_plus,
Так что, вероятно, есть RULE или INSTEAD OF триггер, который делает фактическую вставку.
Плюс есть id столбец, который не заполнен вашим кодом, так что это делается и в другом месте.

Вы можете сосредоточиться на этом коде и проверить, нет ли путаницы между столбцами и значениями, переданными в них.

0

Это довольно старая тема, но я все равно отвечу, так как другие могут посмотреть на нее. Здесь все вроде бы хорошо в терминах вызовов libpq, но проблема в следующем коде:

const char* paramValues[6];
int paramLengths[6];

paramValues[0] = lexical_cast<string>(datasetid).c_str();

lexical_cast возвращает временный std :: string, и вы сохраняете указатель на строку, которая будет / уничтожена.
Необходимо сохранить эти строки где-нибудь или данные memcpy в paramValues ​​(а затем удалить их). Что-то вроде этого:

std::array<std::string, 6> temp_params;
temp_params[0] = lexical_cast<string>(datasetid);
paramValues[0] = temp_params[0].c_str();
0
По вопросам рекламы [email protected]