C++ SQLite和QSqlQuery-多次调用execBatch()失败
我有一个类需要重复执行批插入。QSqlQuery实例是该类的成员。首先,我尝试了以下代码:C++ SQLite和QSqlQuery-多次调用execBatch()失败,c++,qt,sqlite,blackberry-10,qsqlquery,C++,Qt,Sqlite,Blackberry 10,Qsqlquery,我有一个类需要重复执行批插入。QSqlQuery实例是该类的成员。首先,我尝试了以下代码: TOMCache::TOMCache(QObject *parent): QObject(parent) { m_setWithGeoQuery.prepare("INSERT OR REPLACE INTO cache_storage(key, value, lat, lng, expiration) VALUES(?, ?, ?, ?, ?)"); } void TOMCache::
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();
}
令人惊讶的是,它不起作用。它的行为与第一个代码段相同。这是Qt中的一个错误:。
只有同时满足以下两个条件时才会发生:
- 在同一查询上多次调用execBatch
- 这些值是使用QSqlQuery::addBindValue绑定的
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();
}
TOMCache::TOMCache(QObject*parent):QObject(parent){
m_setWithGeoQuery.prepare(“插入或替换到缓存_存储(键、值、lat、lng、过期)值(?,,?,?)”;
}
void TOMCache::flushBuffer(){
QSqlQuery&query=m_setWithGeoQuery;
bindValue(0,m_buffer.at(0));
bindValue(1,m_buffer.at(1));
bindValue(2,m_buffer.at(2));
bindValue(3,m_buffer.at(3));
bindValue(4,m_buffer.at(4));
如果(!query.execBatch())
qWarning()我在sqlite和mysql上遇到了完全相同的问题。你找到解决方案了吗?好吧,我只是在使用第二个代码段中的代码。解析SQL的成本对于更大的批插入是微不足道的。我现在按照你的建议调用bindValue()并准备()在构造函数中。批插入的速度根本没有提高。我在每个execBatch()中插入2000行。但无论如何,谢谢。如果我没有弄错的话,QSQLiteDriver没有BatchOperations功能,因此它通过每个批处理项运行一个exec来模拟execBatch。通过在execBatch之前调用QSqlDatabase::transaction,在execBatch之后调用QSqlDatabase::commit,可以轻松提高性能
QSqlQuery query(m_setWithGeoQuery);
query.addBindValue(m_buffer.at(0));
...
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();
}