3

我正在开发一个具有 sqlite 数据库的 QT C++ 应用程序。这些表使用 QTableView 和 QSqlTableModel 显示。有大约 10K 记录的表。

我的问题是,当我尝试将任何记录更新到具有 10K 记录的表中时,我收到错误消息“数据库已锁定,无法获取行”。当行数较少(比如 20)时,不会发生这种情况。日志文件在应用程序文件夹中创建。似乎某些进程正在锁定数据库。查不出真正的原因。

任何人都可以提出一些解决方案吗?

谢谢,普里扬卡

4

2 回答 2

5

在 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 实例。

最重要的是,您有一个来自某个地方的阻塞查询,您需要正确地使其“不活动”,或者您需要进行仲裁。

于 2013-10-11T21:24:48.143 回答
5

检查是否在另一个窗口中打开了 sqlite 数据库。我遇到了同样的问题,但后来注意到我在数据库的另一个打开的窗口中有未保存的更改。一旦该实例关闭,所有工作都完美无缺。

于 2016-12-02T03:36:44.357 回答