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

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

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

使用道具 举报

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

什么意思?
回复 支持 反对

使用道具 举报

累计签到: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

使用道具 举报

累计签到:15 天
连续签到:1 天
2015-6-7 04:12:51 显示全部楼层
如果说我的数据库里面有ID跟PHONE这两列,而如果我要查找一个号码,我不知道这是ID号还是PHONE号,想让所有查找出来的结果都显示出来,怎么写代码啊
回复 支持 反对

使用道具 举报

累计签到:1568 天
连续签到:1 天
2015-6-10 23:04:46 显示全部楼层
yeemin 发表于 2015-6-7 04:12
如果说我的数据库里面有ID跟PHONE这两列,而如果我要查找一个号码,我不知道这是ID号还是PHONE号,想让所有 ...

查询id==这个号码,或者 phone==这个号码。
回复 支持 反对

使用道具 举报

累计签到:3 天
连续签到:1 天
2015-12-10 16:52:33 显示全部楼层
删除的时候,弹出的对话框中文是乱码的!!!!???mainwindow中都是正常的诶。。。。。
回复 支持 反对

使用道具 举报

累计签到:3 天
连续签到:1 天
2015-12-10 17:26:24 显示全部楼层
我用codecForLocale()就可以显示正常
可是codecForName("utf-8")就不可以,环境中配置的默认编码也是utf-8啊


求解答
回复 支持 反对

使用道具 举报

累计签到:1568 天
连续签到:1 天
2015-12-18 15:19:05 显示全部楼层
vampire 发表于 2015-12-10 17:26
我用codecForLocale()就可以显示正常
可是codecForName("utf-8")就不可以,环境中配置的默认编码也是utf-8 ...

这个编码跟环境编码不同的啊
回复 支持 反对

使用道具 举报

累计签到:1568 天
连续签到:1 天
2015-12-18 15:19:38 显示全部楼层
vampire 发表于 2015-12-10 16:52
删除的时候,弹出的对话框中文是乱码的!!!!???mainwindow中都是正常的诶。。。。。 ...

弹出窗需要自定义。
回复 支持 反对

使用道具 举报

累计签到:83 天
连续签到:1 天
2016-1-19 08:34:33 显示全部楼层
什么样的数据库支持事务操作?
回复 支持 反对

使用道具 举报

累计签到:1568 天
连续签到:1 天
2016-1-19 10:31:31 显示全部楼层
who_am_i_2015 发表于 2016-1-19 08:34
什么样的数据库支持事务操作?

一般都支持吧。你可以测试下。
回复 支持 反对

使用道具 举报

累计签到:109 天
连续签到:1 天
2016-1-21 17:02:45 显示全部楼层
本帖最后由 silverdemon 于 2016-1-21 17:04 编辑

请教版主:
不知道这么理解对不对:
(1)revertAll() 是用来撤销pending changes 的,也就是那些还没有被 submitAll()的改变;一旦submitAll()被调用了,revertAll()也就不管用了。
(2)commit() 和 rollback() 的功能与上面类似,但commit() 和 rollback()这一对儿 是操作数据库的,而 submitAll() 和 revertAll() 是操作 model 里的 数据的;但区别是:即使commit() 被调用,rollback() 也可以撤销 commit()的操作。
(3)当 submitall() 被包含在 事物操作 中时,即使submitAll() 被调用,依旧可以使用 rollback() 来撤销操作。

因为不太理解 为什么要在 “提交修改”按钮 的槽函数里面,调用了submitAll() 之后还要调用 commit(), model里的数据  和数据库里的数据 不是连接的吗,为什么要把一次“数据修改”提交两次呢?

在 “删除选中行” 槽函数里,没有用 事物操作,也无法“撤销操作”。

多谢啦~
回复 支持 反对

使用道具 举报

累计签到:1568 天
连续签到:1 天
2016-1-21 22:46:09 显示全部楼层
silverdemon 发表于 2016-1-21 17:02
请教版主:
不知道这么理解对不对:
(1)revertAll() 是用来撤销pending changes 的,也就是那些还没有被  ...

操作model不是直接操作数据库,只有提交以后才会操作数据库。
回复 支持 反对

使用道具 举报

累计签到:16 天
连续签到:1 天
2016-3-14 17:36:34 显示全部楼层
本帖最后由 a35566 于 2016-3-15 09:47 编辑
silverdemon 发表于 2016-1-21 17:02
请教版主:
不知道这么理解对不对:
(1)revertAll() 是用来撤销pending changes 的,也就是那些还没有被  ...

你理解错了,
database().commit() 实际上是对应的 database().transaction() 这个操作,这两个操纵将它们中间的语句打包成一个事务,这些操作要么全部做完,要么一条也不做。
而 submitAll() 是提交刚刚所做的所有修改。

你可以理解成我需要运输薯片,我先把薯片装塑料袋里,在把这个装着薯片的塑料袋扔纸箱里。
回复 支持 反对

使用道具 举报

累计签到:3 天
连续签到:1 天
2016-3-18 14:51:40 显示全部楼层
运行时弹出应用程序错误 “0*00000000”指令引用的“0*00000000”内存,该内存不能为“read"
回复 支持 反对

使用道具 举报

累计签到:1568 天
连续签到:1 天
2016-3-20 17:25:56 显示全部楼层
studyqt 发表于 2016-3-18 14:51
运行时弹出应用程序错误 “0*00000000”指令引用的“0*00000000”内存,该内存不能为“read" ...

你用什么版本的qt?该教程是基于Qt 4.8的
回复 支持 反对

使用道具 举报

累计签到:3 天
连续签到:1 天
2016-3-22 16:37:09 显示全部楼层
void loginDialog:n_loginBtn_clicked()
{
    model = new QSqlTableModel(this);
    model->setTable("user");
    model->select();
    int i;
    for(i=0;i<model->rowCount();i++)
    {
      QSqlRecord record=model->record(i);
      if(record.value(1)==ui->userLineEdit->text()&&
           record.value(2)==ui->pwdLineEdit->text())
    {
        QString str1="登录成功";
        QString str2=record.value(1).toString();
        QMessageBox::information(this,"提示",str2+str1,QMessageBox::Yes);
        accept();
    }
    else if(record.value(1)==ui->userLineEdit->text()&&
            record.value(2)!=ui->pwdLineEdit->text())
   {
        QMessageBox::information(this,"提示","密码输入有误",QMessageBox::Yes);
        ui->userLineEdit->clear();
        ui->pwdLineEdit->clear();
        ui->userLineEdit->setFocus();
        return;
    }

     QMessageBox::warning(this,"提示","用户不存在,请注册",QMessageBox::Yes);
     ui->userLineEdit->clear();
     ui->pwdLineEdit->clear();
     ui->userLineEdit->setFocus();
      return;
     }
}请问大神要怎么改。输入后登陆显示用户名不存在,数据库连接上了
回复 支持 反对

使用道具 举报

累计签到:3 天
连续签到:1 天
2016-3-22 16:39:05 显示全部楼层
yafeilinux 发表于 2016-3-20 17:25
你用什么版本的qt?该教程是基于Qt 4.8的

这个问题解决了,小白犯了一个低级错误,
回复 支持 反对

使用道具 举报

累计签到:3 天
连续签到:1 天
2016-3-23 08:29:46 显示全部楼层
void loginDialog:n_loginBtn_clicked()
{
model = new QSqlTableModel(this);
model->setTable(“user”);
model->select();
int i;
for(i=0;irowCount();i++)
{
QSqlRecord record=model->record(i);
if(record.value(1)==ui->userLineEdit->text()&&
record.value(2)==ui->pwdLineEdit->text())
{
QString str1=”登录成功”;
QString str2=record.value(1).toString();
QMessageBox::information(this,”提示”,str2+str1,QMessageBox::Yes);
accept();
}
else if(record.value(1)==ui->userLineEdit->text()&&
record.value(2)!=ui->pwdLineEdit->text())
{
QMessageBox::information(this,”提示”,”密码输入有误”,QMessageBox::Yes);
ui->userLineEdit->clear();
ui->pwdLineEdit->clear();
ui->userLineEdit->setFocus();
return;
}
QMessageBox::warning(this,”提示”,”用户不存在,请注册”,QMessageBox::Yes);
ui->userLineEdit->clear();
ui->pwdLineEdit->clear();
ui->userLineEdit->setFocus();
return;
}
}
请问应该怎样改,输入用户名和密码显示用户名不存在
回复 支持 反对

使用道具 举报

累计签到:1568 天
连续签到:1 天
2016-3-23 11:49:41 显示全部楼层
studyqt 发表于 2016-3-23 08:29
void loginDialog:n_loginBtn_clicked()
{
model = new QSqlTableModel(this);

看到第一行,model = new QSqlTableModel(this); 这个你放到了按钮的槽里面,就是每次点击按钮都要创建一次model啊?这个放到构造函数里面去执行,不要放到这里。

然后具体怎么做参考  下载 页面最后面的 数据库管理系统源码。
回复 支持 反对

使用道具 举报

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

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