当前位置:   article > 正文

SQLITE数据库 QSqlError(“5“, “Unable to fetch row“, “database is locked“)问题原因及解决方法

unable to fetch row

用QT 写sqlite数据库在往数据库里写数据的时候遇到了QSqlError("5", "Unable to fetch row", "database is locked")的问题。

意味着数据库文件当前正被另一个进程锁定,导致当前的数据库操作无法获取数据。

可能的原因有: 

1、同一个程序中多线程同时访问一个数据,一个查询一个写入同时进行,事务没有完成,导致数据库锁定。

2、数据库被其他程序打开

但是作者再用这个数据库时并不是,一直写不进去,而是每次数据库插入到257条数据之后,数据库锁定,写不进去。这就让人很烦恼。说明了前期操作数据库读写是没有问题的,而是到了256这个数据节点的时候出了问题。

这时候就没有从数据库本身找问题没用了,后面想到可能是显示的出了问题,用的QSqlTableModel模型将数据库表格导入到模型中进行显示。仔细查了QSqlTableModel的信息后发现每次返回缓存的数据只能有256条,这就对上了,刚好是这个出问题的数据库数字。

解决方法:

  1. //在操作结果前先通过fetchmore()来获取所有的结果
  2. while(model->canFetchMore())
  3. {
  4. model->fetchMore();
  5. }

屏蔽到刷新界面显示的查询,model->select(); 后可以正常显示。

总结:

最后数据库锁定的原因,依旧是因为多线程访问数据库进行读写,而QSqlTableModel刚好只能返回256条信息,导致查询事务没有结束,又进行数据插入,就导致了错误。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/Monodyee/article/detail/634829
推荐阅读
相关标签
  

闽ICP备14008679号