Ошибка при отправке после вставки строки в QSqlTableModel — нет полей для обновления

У меня есть таблица базы данных SQLite со следующей схемой:

TABLE IenState (
   Id      primary key,
   NetId   integer,
   NodeId  integer,
   DevType text
   Qos     integer      
)

С помощью утилиты DB Browser я вставил запись в таблицу.
Я написал программу Qt для взаимодействия с базой данных. Из программы я могу прочитать запись, которая выходит в таблице. Однако, когда я пытаюсь вставить новую запись, я получаю следующую ошибку:

Нет полей для обновления.

Ошибка возникает, когда я отправляю изменения в таблицу. Следующий фрагмент кода показывает, как я выполняю операцию вставки.

QSqlDatabase db = QSqlDatabase::addDatabase("QSQLITE");
db.setDatabaseName("file.db");
if (!db.isOpen()) {        
   qFatal("Failed to open database");          
}

QSqlTableModel model(nullptr, db);
model.setEditStrategy(QSqlTableModel::OnManualSubmit);
model.setTable("IenState");
model.select();

int idRow = model.rowCount();
if (!model.insertRows(idRow, 1)) {
    qFatal("Row insertion FAILED");
}
QSqlRecord record = model.record(idRow);

record.setValue("Id", 3);
record.setValue("NetId", 0);
record.setValue("NodeId", 1);
record.setValue("DevType", "sm");
record.setValue("Qos", 95);

if (!model.setRecord(idRow, record)) {
    qFatal("Setting record FAILED");
}

if (!model.submitAll()) {
    qFatal("Submitting Failed. Error: %s, %d",
        qPrintable(model.lastError().text()),
        model.lastError().type());
}

Код завершается ошибкой при операции model.submitAll() с Ошибкой отправки. Ошибка: нет полей для обновления, 2. Я проверил, запись QSqlRecord имеет имена полей в соответствии со схемой базы данных, и операции record.setValue работают нормально. Я не могу выяснить причину сбоя.


person Jatala    schedule 07.06.2019    source источник
comment
изменить file.db на полный путь   -  person eyllanesc    schedule 07.06.2019
comment
в реальном коде я указываю полный путь к файлу, и, как указано, чтение из файла работает. У меня проблема со вставкой новой записи.   -  person Jatala    schedule 07.06.2019


Ответы (1)


Беглый взгляд, я не эксперт: вы используете idRow, для которого установлено количество строк. Поскольку это индекс с отсчетом от нуля, вы не можете использовать idRow, но вы должны использовать idRow-1. Кроме того, если вы хотите добавить новую запись в конец, используйте -1 в качестве индекса для insertRecord(...). Вы можете запросить чистую запись с помощью model.record() без индекса. Эту запись вы можете использовать для заполнения и вставки. Я надеюсь, это поможет. Повторюсь, я не эксперт.

person Frits    schedule 01.07.2020