赞
踩
用QT 写sqlite数据库在往数据库里写数据的时候遇到了QSqlError("5", "Unable to fetch row", "database is locked")的问题。
意味着数据库文件当前正被另一个进程锁定,导致当前的数据库操作无法获取数据。
可能的原因有:
1、同一个程序中多线程同时访问一个数据,一个查询一个写入同时进行,事务没有完成,导致数据库锁定。
2、数据库被其他程序打开
但是作者再用这个数据库时并不是,一直写不进去,而是每次数据库插入到257条数据之后,数据库锁定,写不进去。这就让人很烦恼。说明了前期操作数据库读写是没有问题的,而是到了256这个数据节点的时候出了问题。
这时候就没有从数据库本身找问题没用了,后面想到可能是显示的出了问题,用的QSqlTableModel模型将数据库表格导入到模型中进行显示。仔细查了QSqlTableModel的信息后发现每次返回缓存的数据只能有256条,这就对上了,刚好是这个出问题的数据库数字。
解决方法:
- //在操作结果前先通过fetchmore()来获取所有的结果
- while(model->canFetchMore())
- {
- model->fetchMore();
- }
屏蔽到刷新界面显示的查询,model->select(); 后可以正常显示。
总结:
最后数据库锁定的原因,依旧是因为多线程访问数据库进行读写,而QSqlTableModel刚好只能返回256条信息,导致查询事务没有结束,又进行数据插入,就导致了错误。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。