QtSQL с MS Access: запросы UPDATE/DELETE не обновляют данные

В настоящее время я столкнулся с проблемой использования QtSQL вместе с базой данных MS Access с использованием драйвера QOBDC.

Операторы SELECT и INSERT работают и правильно читают/вставляют данные.

Операторы UPDATE/DELETE обрабатываются корректно (согласно QSqlQuery и трассировщику OBDC), но в MS Access данные не редактируются.

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

Трассировщик OBDC видит запрос UPDATE, а также 2 привязки.

Есть ли причина, по которой эти операторы UPDATE не изменяют данные MS Access?

База данных

db = QSqlDatabase::addDatabase("QODBC");
db.setDatabaseName(QString("Driver={Microsoft Access Driver (*.mdb, *.accdb)};DSN='';DBQ=") + file);

Функция УДАЛИТЬ

bool MSAccessReader::deleteRecord(QString table, QString where)
{
    QString req;
    req = QString("DELETE FROM ") + table + QString(" WHERE ") + where;
    QSqlQuery query;
    bool ok = query.exec(req);
    return ok;
}

Функция ОБНОВЛЕНИЯ

bool MSAccessReader::update(QList<QString> headers, QList<QVariant> data, QString where, QString table)
{
    if(headers.isEmpty() || data.isEmpty())
    {
        qDebug() << "Headers or data are empty";
        return false;
    }
    else if(headers.size() != data.size())
    {
        qDebug() << "Number of headers and data fields mismatches";
        return false;
    }
    else if(table.isEmpty())
    {
        qDebug() << "Table isn't specified";
        return false;
    }
    else if(where.isEmpty())
    {
        qDebug() << "WHERE isn't specified";
        return false;
    }

    QSqlQuery query;
    QString req;

    req = QString("UPDATE ") + table + QString(" SET ");

    foreach(QString header, headers)
    {
        req = req + header + "=?,";
    }

    req = req.left(req.size()-1);

    /*WHERE*/
    req = req + QString(" WHERE ") + where + QString(";");

    query.prepare(req);


    foreach(QVariant var,data)
    {
        query.addBindValue(var);
    }


    qDebug() << query.lastQuery() << query.boundValues();
    bool ok = query.exec();
    return ok;
}

Строка запроса и данные

"UPDATE Table1 SET Nom=?,Prenom=? WHERE ID=1;" QMap((":a", QVariant(QString, "Jean"))(":bb", QVariant(QString, "Marc")))

Таблица данных

введите описание изображения здесь


person Elcan    schedule 26.10.2016    source источник


Ответы (1)


Нашел проблему.

Мне нужно было выполнить транзакцию() и фиксацию() вокруг запроса:

db.transaction();
bool ok = query.exec();
db.commit();
person Elcan    schedule 26.10.2016