我正在开发一个具有 sqlite 数据库的 QT C++ 应用程序。这些表使用 QTableView 和 QSqlTableModel 显示。有大约 10K 记录的表。
我的问题是,当我尝试将任何记录更新到具有 10K 记录的表中时,我收到错误消息“数据库已锁定,无法获取行”。当行数较少(比如 20)时,不会发生这种情况。日志文件在应用程序文件夹中创建。似乎某些进程正在锁定数据库。查不出真正的原因。
任何人都可以提出一些解决方案吗?
谢谢,普里扬卡
在 Qt 中,您将 PRAGMA 发送到您的数据库,如下所示:
dbObj = QSqlDatabase::addDatabase(...);
dbObj.setDatabaseName(...);
dbObj.open();
dbObj.exec("PRAGMA locking_mode = EXCLUSIVE");
但是,我认为这不是您想要的。来自 Qt 文档:
执行选择时,驱动程序被锁定以进行更新。这在使用 QSqlTableModel 时可能会导致问题,因为 Qt 的项目视图会根据需要获取数据(在 QSqlTableModel 的情况下使用 SqlQuery::fetchMore())。
看看 QSqlQuery::isActive 说:
如果查询处于活动状态,则返回 true。一个活动的 QSqlQuery 是一个已经成功执行但尚未完成的 QSqlQuery。当您完成一个活动查询时,您可以通过调用 finish() 或 clear() 使查询不活动,或者您可以删除 QSqlQuery 实例。
最重要的是,您有一个来自某个地方的阻塞查询,您需要正确地使其“不活动”,或者您需要进行仲裁。
检查是否在另一个窗口中打开了 sqlite 数据库。我遇到了同样的问题,但后来注意到我在数据库的另一个打开的窗口中有未保存的更改。一旦该实例关闭,所有工作都完美无缺。