gpt4 book ai didi

c++ - SQLite 和 QSqlQuery - 多次调用 execBatch() 失败

转载 作者:搜寻专家 更新时间:2023-10-31 01:45:25 27 4
gpt4 key购买 nike

我有一个类需要重复执行批量插入。 QSqlQuery 实例是该类的成员。起初我试过这段代码:

TOMCache::TOMCache(QObject *parent): QObject(parent) {    
m_setWithGeoQuery.prepare("INSERT OR REPLACE INTO cache_storage(key, value, lat, lng, expiration) VALUES(?, ?, ?, ?, ?)");
}

void TOMCache::flushBuffer() {
QSqlQuery &query = m_setWithGeoQuery;
query.addBindValue(m_buffer.at(0));
query.addBindValue(m_buffer.at(1));
query.addBindValue(m_buffer.at(2));
query.addBindValue(m_buffer.at(3));
query.addBindValue(m_buffer.at(4));
if(!query.execBatch())
qWarning() << "-- execBatch() failed: " << query.lastError().text();
m_buffer.clear();
m_buffer << QVariantList() << QVariantList() << QVariantList() << QVariantList() << QVariantList();
}

那没用。创建的 SQLite 文件有 65536 字节,但表 cache_storage 中只有 1 行(多次调用 flushBuffer())。看起来 execBatch() 的第一次调用成功执行,而下一次调用静默失败(它们一直返回 true)。我意识到以下代码有效:

void TOMCache::flushBuffer() {

QSqlQuery query;
query.prepare("INSERT OR REPLACE INTO cache_storage(key, value, lat, lng, expiration) VALUES(?, ?, ?, ?, ?)");
query.addBindValue(m_buffer.at(0));
query.addBindValue(m_buffer.at(1));
query.addBindValue(m_buffer.at(2));
query.addBindValue(m_buffer.at(3));
query.addBindValue(m_buffer.at(4));
if(!query.execBatch())
qWarning() << "-- execBatch() failed: " << query.lastError().text();
m_buffer.clear();
m_buffer << QVariantList() << QVariantList() << QVariantList() << QVariantList() << QVariantList();
}

我有几个问题:

  1. 是否需要为每次调用 execBatch() 创建和销毁 QSqlQuery?

  2. 如果是这样,为什么 execBatch() 的后续调用假装执行成功?

  3. 第一种情况下的大文件怎么办? (只有2张 table ,另一张是空的)

我应该提一下,这是在 BlackBerry 10 操作系统上运行的应用程序的一部分。为了避免每次都创建和销毁 QSqlQuery,我还尝试在 flushBuffer() 的末尾调用 query.clear() 但这似乎也从 QSqlQuery 实例中删除了准备好的 SQL(下一次调用 execBatch() 失败) .

编辑:我试图避免每次都解析 SQL,所以我试图保持 m_setWithGeoQuery 不变,只是在 flushBuffer() 中复制它:

    QSqlQuery query(m_setWithGeoQuery);
query.addBindValue(m_buffer.at(0));
...

令人惊讶的是,它不起作用。它的行为与第一个片段相同。

最佳答案

这是 Qt 中的错误:https://bugreports.qt.io/browse/QTBUG-43874 .只有同时满足两个条件才会发生:

  • 对同一查询多次调用 execBatch
  • 使用 QSqlQuery::addBindValue 绑定(bind)值

因此,您可以通过调用 QSqlQuery::bindValue 来解决这个错误,所以下面的代码应该可以工作

TOMCache::TOMCache(QObject *parent): QObject(parent) {    
m_setWithGeoQuery.prepare("INSERT OR REPLACE INTO cache_storage(key, value, lat, lng, expiration) VALUES(?, ?, ?, ?, ?)");
}

void TOMCache::flushBuffer() {
QSqlQuery &query = m_setWithGeoQuery;
query.bindValue(0, m_buffer.at(0));
query.bindValue(1, m_buffer.at(1));
query.bindValue(2, m_buffer.at(2));
query.bindValue(3, m_buffer.at(3));
query.bindValue(4, m_buffer.at(4));
if(!query.execBatch())
qWarning() << "-- execBatch() failed: " << query.lastError().text();
m_buffer.clear();
m_buffer << QVariantList() << QVariantList() << QVariantList() << QVariantList() << QVariantList();
}

关于c++ - SQLite 和 QSqlQuery - 多次调用 execBatch() 失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22171992/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com