Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/153.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ SQLite和QSqlQuery-多次调用execBatch()失败_C++_Qt_Sqlite_Blackberry 10_Qsqlquery - Fatal编程技术网

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

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::

我有一个类需要重复执行批插入。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();
}
令人惊讶的是,它不起作用。它的行为与第一个代码段相同。

这是Qt中的一个错误:。 只有同时满足以下两个条件时才会发生:

  • 在同一查询上多次调用execBatch
  • 这些值是使用QSqlQuery::addBindValue绑定的
因此,您可以通过调用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();
}
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();
}