PostgreSQL/PostGIS - PQexecParams - неправильный тип элемента

У меня есть этот код.

const char * q = "INSERT INTO test_raster (raw_data) VALUES 
    (ST_SetValues(ST_AddBand(ST_MakeEmptyRaster(2, 2, -180, -90, 180, -90, 0, 0, 4326), 
     1, '8BUI', 0, 0), 1, 1, 1, $1::double precision[][]))";

double tmp[2][2] = { {0, 125}, {45, 255} };

const char *values[1] = { (char *)&tmp };
int lengths[1] = { 4*sizeof(double) };
int binary[1] = { 1 };

PGresult *rs = PQexecParams(psql,
    q,
    1,
    NULL,
    values,
    lengths, 
    binary,
    0);

auto stat = PQresultStatus(rs);

printf("%s", PQresultErrorMessage(rs));

где psqlподключение к PostgreSQL с PostGIS. Однако когда я запустил этот код, я получил"ERROR: wrong element type"

Чем это вызвано? OID должен выводиться базой данных из указанных::double precision[][]

1 ответ

Проблема в том, что внутренний двоичный формат файла double precision[] сильно отличается от массива C.

Если вы действительно не хотите использовать текстовый формат, вам придется самостоятельно построить представление внутреннего двоичного массива.

Видеть include/server/utils/array.hдля подробностей. Поскольку вы не можете установить связь с сервером PostgreSQL в клиентском коде, вы не можете использовать служебные функции из этого файла. Также учтите, что внутреннее двоичное представлениеdouble precision могут отличаться на клиенте и сервере, если машины имеют разную архитектуру.

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

Другие вопросы по тегам