找回密码
 立即注册
收起左侧
楼主: yafeilinux

第25篇 数据库(五)SQL表格模型QSqlTableModel

82
回复
60674
查看
[复制链接]
累计签到:11 天
连续签到:1 天
2015-5-2 20:09:36 显示全部楼层
我用的QSQLITE数据库,向里面不断的写数据,采用QSqlTableModel的insertRow()和setData()向数据库写数据的方式,并且附带表格显示。
一开始正常,运行一段时间后大概在第25**512个数据的时候会出错,表格上显示的数据就卡在这个位置,还会出现“column id is not unique Unable to fetch row”这种数据库的错误。
我用用rowCount()来获取行数
有人说:这是因为在用rowCount()来获取行数的时候,当数据超过256时,rowCount()获取的行数是错误的。
怎么解决这个问题??谢谢
回复 支持 1 反对 0

使用道具 举报

累计签到:1570 天
连续签到:1 天
2015-3-25 11:36:34 显示全部楼层
pkgfs 发表于 2015-3-25 11:32
如果不用id做主键该怎么做?

什么意思?
回复 支持 反对

使用道具 举报

累计签到:75 天
连续签到:1 天
2015-3-25 11:32:24 显示全部楼层
如果不用id做主键该怎么做?
回复 支持 反对

使用道具 举报

尚未签到

2014-12-23 16:25:37 显示全部楼层
非常感谢 受教了 字数补丁
回复 支持 反对

使用道具 举报

累计签到:1570 天
连续签到:1 天
2014-8-8 19:59:22 显示全部楼层
shasidaran 发表于 2014-8-6 15:59
发现一处小错误  
3.向项目中添加新的C++头文件,名称为connection.h。完成后将其内容更改如下:[/backcolo ...

嗯。代码是没有错误的,可能是发帖的时候格式乱了。
回复 支持 反对

使用道具 举报

累计签到:597 天
连续签到:1 天
2014-8-6 15:59:35 显示全部楼层
本帖最后由 shasidaran 于 2014-8-6 16:03 编辑

发现一处小错误  
3.向项目中添加新的C++头文件,名称为connection.h。完成后将其内容更改如下:
#ifndef CONNECTION_H
#define CONNECTION_H
#include <QSqlDatabase>
#include <QSqlQuery>
static bool createConnection()
{
    QSqlDatabase db = QSqlDatabase::addDatabase("QSQLITE");
    db.setDatabaseName("database.db");
    if(!db.open()) return false;
    QSqlQuery query;
    query.exec(QString(
      "create tablestudent (id int primary key, name vchar)"));
    query.exec(QString("insert into student values (0,'刘明')"));
    query.exec(QString("insert into student values (1,'陈刚')"));
    query.exec(QString("insert into student values (2,'王红')"));
    return true;
}
#endif // CONNECTION_H
       这里因为语句中使用了中文,所以使用了QString()进行编码转换,这个还需要在main()函数中设置编码。


在一、3中create tablestudent应该是create table student
回复 支持 反对

使用道具 举报

累计签到:1570 天
连续签到:1 天
2014-7-2 22:22:49 显示全部楼层
codemoon 发表于 2014-7-1 00:06
yafei老师什么时候继续更新课程呢?嘿嘿

快了。
回复 支持 反对

使用道具 举报

累计签到:3 天
连续签到:1 天
2014-7-1 00:06:35 显示全部楼层
yafeilinux 发表于 2014-6-30 21:34
呵呵,是啊。

yafei老师什么时候继续更新课程呢?嘿嘿
回复 支持 反对

使用道具 举报

累计签到:1570 天
连续签到:1 天
2014-6-30 21:34:25 显示全部楼层
codemoon 发表于 2014-6-19 22:00
大概弄明白了,submitAll是提交对model的更改到数据库,但这里的具体情况是因为要放到事务里执行,所以需 ...

呵呵,是啊。
回复 支持 反对

使用道具 举报

累计签到:3 天
连续签到:1 天
2014-6-19 22:00:50 显示全部楼层
codemoon 发表于 2014-6-18 14:31
想问一下yafei,下面代码的submitAll() 和 database().commit() ,为什么要有两个提交的?具体的作用分别是 ...

大概弄明白了,submitAll是提交对model的更改到数据库,但这里的具体情况是因为要放到事务里执行,所以需要commit。
回复 支持 反对

使用道具 举报

累计签到:3 天
连续签到:1 天
2014-6-18 14:31:39 显示全部楼层
想问一下yafei,下面代码的submitAll() 和 database().commit() ,为什么要有两个提交的?具体的作用分别是什么?

if (model->submitAll()) {
       model->database().commit(); //提交
    } else {
       model->database().rollback(); //回滚
       QMessageBox::warning(this, tr("tableModel"),
                             tr("数据库错误: %1")
                             .arg(model->lastError().text()));
    }
回复 支持 反对

使用道具 举报

累计签到:1570 天
连续签到:1 天
2014-4-9 18:26:10 显示全部楼层
cloudyf 发表于 2014-4-8 20:57
不同的工程有什么意义嘛?比如说我要做一个平台,里面有很多不同的窗口,窗口实现不同的功能,这样需要建 ...

这个得看自己需求啊,一般在一个工程里面即可。因为一个工程编译后就是一个可执行文件(也就是一个独立的软件。)
回复 支持 反对

使用道具 举报

累计签到:10 天
连续签到:1 天
2014-4-8 20:57:21 显示全部楼层
yafeilinux 发表于 2014-4-8 18:58
当然可以了。

不同的工程有什么意义嘛?比如说我要做一个平台,里面有很多不同的窗口,窗口实现不同的功能,这样需要建立不同的工程嘛
回复 支持 反对

使用道具 举报

累计签到:1570 天
连续签到:1 天
2014-4-8 18:58:16 显示全部楼层
cloudyf 发表于 2014-4-8 14:14
Qt里面可以同时建立两个工程嘛??

当然可以了。
回复 支持 反对

使用道具 举报

累计签到:10 天
连续签到:1 天
2014-4-8 14:14:36 显示全部楼层
Qt里面可以同时建立两个工程嘛??
回复 支持 反对

使用道具 举报

累计签到:213 天
连续签到:1 天
2013-10-27 16:53:54 显示全部楼层
我在学习。顺利完成这本篇。
毕业设计就是做了一个类似的界面,站长的教程更简单。谢谢站长!
回复 支持 反对

使用道具 举报

累计签到:1 天
连续签到:1 天
2013-10-15 18:14:32 显示全部楼层
感谢yafeilinux,每天都能从你这里学到新知识
回复 支持 反对

使用道具 举报

累计签到:1570 天
连续签到:1 天
2013-9-24 10:41:48 显示全部楼层
baoniu 发表于 2013-9-23 21:26
model->rowCount()获取不到数据库里总行数,只能获取UI上表格里面的总行数,有点老火 ...

那得看model里面的内容是不是数据库总的内容啊,如果不是,当然就无法获得了。
回复 支持 1 反对 0

使用道具 举报

累计签到:36 天
连续签到:1 天
2013-9-23 21:26:10 显示全部楼层
model->rowCount()获取不到数据库里总行数,只能获取UI上表格里面的总行数,有点老火
回复 支持 反对

使用道具 举报

累计签到:75 天
连续签到:1 天
2013-8-8 22:58:05 显示全部楼层
yafeilinux 发表于 2013-8-8 16:21
1.数据库文件创建一次就不再创建了,所以在源码中修改表格内容,需要先删除前面生成的data文件;
2.在新 ...

1,3 明白了 ,谢谢楼主。
第二个问题,直接使用query.exec("insert into student values (0,'刘明')"); 设置utf8不行 ,设置为system 就可以了,应该还是版本的问题
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

公告
可以关注我们的微信公众号yafeilinux_friends获取最新动态,或者加入QQ会员群进行交流:190741849、186601429(已满) 我知道了