Я пытаюсь вставить несколько двоичных строк с помощью PQputCopyData, в моем случае две строки, вот мой код, он не работает, вставляя две строки. Я не знаю, как я могу структурировать свой буфер для вставки нескольких строк. Не могли бы вы помочь, пожалуйста?
В моей таблице два идентификатора столбца: целое число и имя: текст
Сообщения об ошибках: «ОШИБКА: количество полей строки равно 0, ожидается 2 КОНТЕКСТ: КОПИРОВАТЬ t, строка 2 "
res = PQexec(conn, "create table if not exists t(id int, name text);");
PQclear(res);
/* Binary COPY demo */
char header[12] = "PGCOPY\n\377\r\n\0";
int flag = 0;
int extension = 0;
char buffer[100];
memcpy(buffer, header, 11);
memcpy(&buffer[11], (void *)&flag, 4);
memcpy(&buffer[15], (void *)&extension, 4);
short fieldnum = 2;
memcpy(&buffer[19], myhton((char *)&fieldnum, 2), 2);
// Here i insert the first row
int size = 4;
memcpy(&buffer[21], myhton((char *)&size, 4), 4);
int id = 10;
memcpy(&buffer[25], (void *)&id, 4);
size = 10;
memcpy(&buffer[29], myhton((char *)&size, 4), 4);
memcpy(&buffer[33], "bbbbbccccc", 10);
// here i insert the second row
size = 4;
memcpy(&buffer[43], myhton((char *)&size, 4), 4);
int id1 = 14;
memcpy(&buffer[47], (void *)&id1, 4);
size = 5;
memcpy(&buffer[51], myhton((char *)&size, 4), 4);
memcpy(&buffer[55], "dddee", 5);
short negative = -1;
memcpy(&buffer[60], myhton((char *)&negative, 2), 2);
res = PQexec(conn, "COPY t FROM STDIN (FORMAT binary);");
if (PQresultStatus(res) != PGRES_COPY_IN) {
cout << "Not in COPY_IN mode";
PQclear(res);
} else {
PQclear(res);
cout << "Enter COPY_IN mode" << endl;
int copyRes = PQputCopyData(conn, buffer, 62);
if (copyRes == 1) {
if (PQputCopyEnd(conn, NULL) == 1) {
res = PQgetResult(conn);
if (PQresultStatus(res) == PGRES_COMMAND_OK) {
cout << "Insert a record successfully" << endl;
} else {
cout << PQerrorMessage(conn) << endl;
}
PQclear(res);
} else {
cout << PQerrorMessage(conn) << endl;
}
} else if (copyRes == 0) {
cout << "Send no data, connection is in nonblocking mode" << endl;
} else if (copyRes == -1) {
cout << "Error occur: " << PQerrorMessage(conn) << endl;
}
}