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