我有一个类需要重复执行批处理插入。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中只有一行(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();
}
我有几个问题:
我应该指出,这是运行在BlackBerry 10操作系统上的应用程序的一部分。为了避免每次创建和销毁QSqlQuery,我还尝试在flushBuffer()结尾调用query.clear(),但这似乎也从QSqlQuery实例中删除了准备好的SQL (下一次execBatch()调用失败)。
编辑:我试图避免每次解析SQL,所以我尝试不修改m_setWithGeoQuery,只需在flushBuffer()中复制它:
QSqlQuery query(m_setWithGeoQuery);
query.addBindValue(m_buffer.at(0));
...
令人惊讶的是,它不起作用。它的行为与第一个片段相同。
发布于 2015-01-16 01:18:02
这是Qt:https://bugreports.qt.io/browse/QTBUG-43874中的一个bug。只有在满足这两种条件时才会发生这种情况:
因此,您可以通过调用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();
}
https://stackoverflow.com/questions/22171992
复制