- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我有一个类需要重复执行批量插入。 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();
}
我有几个问题:
是否需要为每次调用 execBatch() 创建和销毁 QSqlQuery?
如果是这样,为什么 execBatch() 的后续调用假装执行成功?
第一种情况下的大文件怎么办? (只有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 .只有同时满足两个条件才会发生:
因此,您可以通过调用 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/
我正在检查我创建的应用程序的内存使用情况。它进行多次调用以从数据库 (SQLite 3) 读取和写入值。我观察到以下内容: QSqlQuery::exec() 使用一些 KB 的 RAM 来执行给定的
文档在这个主题上有点含糊: 来自 void QSqlQuery::clear() : Clears the result set and releases any resources held by
我有很多 C++11 线程在运行,它们有时都需要数据库访问。在主要我做初始化数据库连接并打开数据库。 Qt 文档说查询不是线程安全的,所以我使用全局互斥锁,直到 QSqlQuery 存在于线程中。 这
我正在尝试从数据库中检索用户,他们的名字是 'DOMAIN\name'。 我已经在 sql 控制台中检查了查询,简单的选择如下: select * from users where name='DOM
SHA256 sha256; std::string s = sha256(pass.toStdString()); QString myquery = "declare @identifier nv
我正在尝试将一个字符插入到表格的列中。而是插入字符的十进制代码。如何插入字符? 详细信息: QString insertSql; insertSql .append("INSERT INTO
QMake 版本 3.0 Qt 版本 5.0.2 使用时 QSqlQuery query(QString("SELECT device_text_id FROM device")); qDebug()
我尝试用 Qt 创建一个 SQLite 数据库,我做到了!!我将我的数据库命名为“prova_db”,它包含下表: marker_db id site (columns) 0 www
我有自己的数据存储机制来存储数据。但我想为最终用户实现标准的数据操作和查询接口(interface),所以我认为 QT sql 适合我的情况。但我仍然不明白如何将索引用于 sql 查询。比方说,我有包
如何取消长时间运行的QSqlQuery? 数据库正在返回超过 300 万行,并且显示在 QTableView 控件中。我希望能够强制停止这两个长时间操作: 当数据库正在运行一个长时间的操作时 如果数据
正在关注 QSqlQuery Class documentation可以在 MySQL 数据库中实现插入操作,即像这样: QSqlQuery query; query.prepare("INSERT
当运行下面的代码时,Windows 中的结果是 'אבגדה' 和 '??????'在Linux上,似乎qry.value(0)(一种 QVarient 类型)使用默认编码。在 Linux 中,我在驱
我使用 PyQt4.QtSql.QSqlQuery。我从表单中获取值并想将它们插入到数据库中。我打开一个连接并尝试添加,但数据库中没有值,也没有错误。有什么问题? db = QSql
我正在尝试选择我的日期库的一个字段,代码是: if (db.db().isOpen()) { qDebug() << "OK"; QSqlQuery query("SELECT state F
出于测试目的,我试图在实际运行之前从 QSqlQuery 对象中获取准备好的语句字符串。 我检查了 lastQuery() 和 executedQuery() 方法,但它们都不起作用。 void fo
我最近才发现 gmock,现在正在“重新思考整个编程过程”,尽可能地添加单元测试。在此过程中让我感到奇怪的一件事是 QSql 模块显然是我们代码的外部依赖项,并没有为开发人员提供模拟其内部的工具。对于
我正在尝试使用此代码使用 qt 进行删除: int jobId = 655; query.prepare("DELETE FROM jobs WHERE jobId = '" + QString::n
我在 Qt 的 sqlite 数据库中看到莫名其妙的缓慢行为。下面代码中的查询,当从同一数据库上的 sqlite 命令行实用程序执行时,会立即完成。 qDebug() textFormIds; if
我想实现一种方法,该方法将在退出程序时检查搜索具有 localhost ip 地址的条目并删除这些行。 问题是,我不确定如何在 Qt 中执行此操作,当我搜索时,我真的找不到任何具体的东西。有没有办法在
我正在使用带有 Qt 提供程序的 firebird 嵌入式数据库。为了使用数据库,我使用 qsqlquery::exec() 函数。这个函数是同步的还是异步的? 最佳答案 QSqlQuery::exe
我是一名优秀的程序员,十分优秀!