Последующая вставка записей с QSqlTableRecord завершится неудачно после первой ошибки - PullRequest
1 голос
/ 27 июля 2010

У меня проблема со вставкой данных в базу данных SQLite с использованием QSqlTableModel. Таблица создана так:

QSqlQuery createTblSMS("CREATE TABLE sms_tbl("
        "isRead BOOLEAN NOT NULL,"
        "readTime DATETIME,"
        "arrivalTime DATETIME NOT NULL,"
        "sender TEXT NOT NULL,"
        "receiver TEXT NOT NULL,"
        "smsContent TEXT,"
        "PRIMARY KEY(arrivalTime, sender, receiver));");

Я вставляю записи следующим образом:

smsModel->insertRecord(-1, sms);
QString error = smsModel->lastError().text();
smsModel->submitAll();

smsModel - это QSqlTableModel.

Если я поставлю, например, запись с этими значениями (false, NULL, '2010-06-30 17:27:55', '075710383', 'ONE 142140', 'TOP 15 # 2') - запись вставлен. После этой записи, если поставить, например, запись с этими значениями (false, NULL, '2010-06-30 10:05:29', '075710383', 'ONE 142140', 'TOP 15 # 3') - также эта запись вставлен.

Но если я попытаюсь повторно вставить запись (false, NULL, '2010-06-30 17:27:55', '075710383', 'ONE 142140', 'TOP 15 # 2'), которая уже находится в В базе данных smsModel выдаст ошибку, подобную этой: «столбцы прибытие, отправитель, получатель не являются уникальными. Невозможно получить строку» - что ожидается. Любые другие последующие вставки уникальных записей завершатся неудачно, и модель выдаст мне ту же ошибку. У вас есть какие-либо подсказки, почему это происходит?

Ответы [ 3 ]

1 голос
/ 12 сентября 2011

Я столкнулся с этой проблемой в два раза.

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

Чтобы исправить это, вам нужно вызвать call select () или revertAll, чтобы удалить ожидающие изменения.

Документ не делает это очень очевидным, но он есть, зацените: http://doc.qt.io/qt-4.8/qsqltablemodel.html#submitAll

0 голосов
/ 25 августа 2010

Через некоторое время мне не удалось найти решение с QSqlTableModel, поэтому я сделал обходной путь с QSqlQuery. Код такой:

QSqlQuery query(QSqlDatabase::database(mConnectionName));
    query.prepare("INSERT INTO sms_tbl (isRead, readTime, arrivalTime,"
        "sender, receiver, smsContent) "
        "VALUES (:isRead, :readTime, :arrivalTime, "
        ":sender, :receiver, :smsContent)");
    query.bindValue(":isRead", sms.value("isRead").toBool());
    query.bindValue(":readTime", sms.value("readTime").toString());
    query.bindValue(":arrivalTime", sms.value("arrivalTime").toString());
    query.bindValue(":sender", sms.value("sender").toString());
    query.bindValue(":receiver", sms.value("receiver").toString());
    query.bindValue(":smsContent", sms.value("smsContent").toString());
    query.exec();
0 голосов
/ 27 июля 2010

Вы не можете снова добавить запись с тем же первичным ключом . У вас есть первичный ключ , который содержит столбцы arrivalTime, sender, receiver. Таким образом, вы не можете значение с одинаковыми значениями этих трех значений.

Вы можете изменить оператор создания и автоинкремент sms_table_id типа int.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...