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

用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条信息,导致查询事务没有结束,又进行数据插入,就导致了错误。

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值