• 9479阅读
  • 17回复

[提问]Qt中QSqlQuery的问题,希望得到前辈的指教 [复制链接]

上一主题 下一主题
离线德国蟑螂
 

只看楼主 倒序阅读 楼主  发表于: 2015-10-02
       最近在学习Qt中的数据部分,一直有个问题,没解决,就是采用QSqlQueryexec函数去查询一个数据库时,第一次运行程序,打印加载的数据,但是关闭程序(不到工程目录下删除db文件),重新运行时,再次去加载,却把第一次加载的数据也打印出来了,相当于重复打印了两组数据,第三次运行就重复了三次数据,每次到工程文件下删除db文件可以解决这个问题,但是那个并不是好办法,我猜测是不是qsqlquery这个类的exec每次执行数据库语句时,总有缓存,求各位大神能告知如何解决这个问题,非常感谢!!!
离线圣域天子

只看该作者 1楼 发表于: 2015-10-02
关闭 .exe 了吗?那DB中是不是每次都新加了一条纪录呀???sqlite ?
离线德国蟑螂

只看该作者 2楼 发表于: 2015-10-02
回 圣域天子 的帖子
圣域天子:关闭 .exe 了吗?那DB中是不是每次都新加了一条纪录呀???sqlite ?  (2015-10-02 10:31) 

关闭了啊,然后重新运行的时候,就出现上面的那种情况。可能是多加了几条记录,如何避免多加内?是sqlite,非常感谢,
离线圣域天子

只看该作者 3楼 发表于: 2015-10-02
回 德国蟑螂 的帖子
德国蟑螂:关闭了啊,然后重新运行的时候,就出现上面的那种情况。可能是多加了几条记录,如何避免多加内?是sqlite,非常感谢, (2015-10-02 10:35) 

那不就是你DB操作有误嘛~~~
业务逻辑处理有问题
离线德国蟑螂

只看该作者 4楼 发表于: 2015-10-02
回 圣域天子 的帖子
圣域天子:那不就是你DB操作有误嘛~~~
业务逻辑处理有问题 (2015-10-02 11:25) 

那这个能指点一个解决的办法不,或者有哪个函数可以解决,我还没找到,希望得到指点,谢谢
离线彩阳

只看该作者 5楼 发表于: 2015-10-03
要看看你的SQL语句以及相关的C++代码,看如何操作的。
上海Qt开发联盟,热忱地欢迎你的加入!
离线德国蟑螂

只看该作者 6楼 发表于: 2015-10-03
回 彩阳 的帖子
彩阳:要看看你的SQL语句以及相关的C++代码,看如何操作的。 (2015-10-03 21:18) 

下面是创建数据库的文件程序代码,单独的一部分
QSqlDatabase db = QSqlDatabase::addDatabase("QSQLITE");
    db.setHostName("host");
    db.setDatabaseName("happyRent.db");
    db.setUserName("whj");
    db.setPassword("123456");

    if(!db.open())
     {
       return false;
     }
    QSqlQuery query;
    //创建一张房间类型表
    query.exec("create table roomtype(id varchar primary key,type varchar"
               ",dateprice varchar,monthprice varchar)");
    query.exec(QString("insert into roomtype values('0','请选择房间类型',NULL,NULL)"));
    query.exec(QString("insert into roomtype values('1','大床房','80','800')"));
    query.exec(QString("insert into roomtype values('2','单人间','60','650')"));
    query.exec(QString("insert into roomtype values('3','双人间','100','1000')"));

    query.exec("create table roominfo(type varchar"
               ",roomnum varchar,isrent varchar)");
    query.exec(QString("insert into roominfo values('大床房','201','否')"));
    query.exec(QString("insert into roominfo values('单人间','202','否')"));
    query.exec(QString("insert into roominfo values('双人间','203','否')"));
    query.exec(QString("insert into roominfo values('大床房','204','否')"));
    query.exec(QString("insert into roominfo values('单人间','205','否')"));
    query.exec(QString("insert into roominfo values('双人间','206','否')"));
    query.exec(QString("insert into roominfo values('大床房','207','否')"));
    query.exec(QString("insert into roominfo values('单人间','208','否')"));
    query.exec(QString("insert into roominfo values('双人间','209','否')"));
    query.exec(QString("insert into roominfo values('单人间','210','否')"));
离线德国蟑螂

只看该作者 7楼 发表于: 2015-10-03
回 德国蟑螂 的帖子
德国蟑螂:下面是创建数据库的文件程序代码,单独的一部分
QSqlDatabase db = QSqlDatabase::addDatabase("QSQLITE");
    db.setHostName("host");
    db.setDatabaseName("happyRent.db");
....... (2015-10-03 23:27) 

QSqlQuery query;
       query.exec(QString("select * from roomtype where type='%1'").arg(type));
       query.next();
       ui->monthpriceEdit->setText(query.value(3).toString());
       ui->datepriceEdit->setText(query.value(2).toString());

       QSqlQuery query2;
       query2.exec(QString("select type,roomnum,isrent from roominfo where type='%1'").arg(type));

       while(query2.next())
       {
           qDebug() << query2.value(0).toString() << query2.value(1).toString() << query2.value(2).toString() << endl;

       }这个是查询语句,在第一运行程序的时候,可以打印出正确的结果,但是第二次就重复打印了一次
离线yanwuyue

只看该作者 8楼 发表于: 2015-10-06
回 德国蟑螂 的帖子
德国蟑螂:下面是创建数据库的文件程序代码,单独的一部分
QSqlDatabase db = QSqlDatabase::addDatabase("QSQLITE");
    db.setHostName("host");
    db.setDatabaseName("happyRent.db");
....... (2015-10-03 23:27)

感觉是你这部分代码重复运行了,有一点可以确认,肯定是你的逻辑层代码出问题了,我也用sqlite
离线德国蟑螂

只看该作者 9楼 发表于: 2015-10-07
回 yanwuyue 的帖子
yanwuyue:感觉是你这部分代码重复运行了,有一点可以确认,肯定是你的逻辑层代码出问题了,我也用sqlite
 (2015-10-06 10:42) 

这个确实很有可能是这个位置的问题,导致每次运行程序都重复加载,应该有一个判断条件来判断该系统中是否存在之前的创建的数据库,我采用了
      QSqlDatabase   temp_db = QSqlDatabase::database();
      qDebug() <<temp_db.databaseName();
发现这样打印不出东西,貌似没有获取该有的数据库
离线yanwuyue

只看该作者 10楼 发表于: 2015-10-07
回 德国蟑螂 的帖子
德国蟑螂:
这个确实很有可能是这个位置的问题,导致每次运行程序都重复加载,应该有一个判断条件来判断该系统中是否存在之前的创建的数据库,我采用了
      QSqlDatabase   temp_db = QSqlDatabase::database();
      qDebug() <<temp_db.databaseName();
发现这样打印不出东西,貌似没有获取该有的数据库

QSqlDatabase::database()

这是获取已经打开过的接口,程序结束时QSqlDatabase会关闭所有接口,
这个用法是数据库打开后,在其他地方可以直接通过QSqlDatabase::database()调出对应接口,
所有你直接调用当然是空的,因为没打开任何数据库
判断有没有数据是通过sql语句执行获取
离线德国蟑螂

只看该作者 11楼 发表于: 2015-10-07
回 yanwuyue 的帖子
yanwuyue:QSqlDatabase::database()
这是获取已经打开过的接口,程序结束时QSqlDatabase会关闭所有接口,
这个用法是数据库打开后,在其他地方可以直接通过QSqlDatabase::database()调出对应接口,
....... (2015-10-07 10:56) 

我不是判断有没有数据,而是在运行程序时判断一个数据库是否存在,Qt中是否有提供这种接口来让我获取,或者是指定数据库名的数据库,可否加QQ私聊1363981327,非常感谢
离线yanwuyue

只看该作者 12楼 发表于: 2015-10-07
回 德国蟑螂 的帖子
德国蟑螂:我不是判断有没有数据,而是在运行程序时判断一个数据库是否存在,Qt中是否有提供这种接口来让我获取,或者是指定数据库名的数据库,可否加QQ私聊1363981327,非常感谢
(2015-10-07 11:07)

sqlite如果不是内存表模式可以QFile直接判断数据库文件存不存在

或者直接用sql判断某一个表存不存在(内存表模式也适用)
离线圣域天子

只看该作者 13楼 发表于: 2015-10-07
open 前需删除旧表,否则OPEN是要开原先的表。
然后 create table 是执行失败的。
但后面的 insert into 又是成功新建纪录的,所以就不断的重复了 ...
离线德国蟑螂

只看该作者 14楼 发表于: 2015-10-07
回 yanwuyue 的帖子
yanwuyue:sqlite如果不是内存表模式可以QFile直接判断数据库文件存不存在
或者直接用sql判断某一个表存不存在(内存表模式也适用)
 (2015-10-07 12:17) 

通过文件方式确实可以判断是否存在,不过新的问题就是如果存在这个数据库,那么该如何打开他
离线德国蟑螂

只看该作者 15楼 发表于: 2015-10-07
回 圣域天子 的帖子
圣域天子:open 前需删除旧表,否则OPEN是要开原先的表。
然后 create table 是执行失败的。
但后面的 insert into 又是成功新建纪录的,所以就不断的重复了 ... (2015-10-07 17:32) 

肯定不能删除表,因为表中包含的信息都是有用的啊,如果删除了那数据库就没体现作用了,
离线圣域天子

只看该作者 16楼 发表于: 2015-10-07
回 德国蟑螂 的帖子
德国蟑螂:肯定不能删除表,因为表中包含的信息都是有用的啊,如果删除了那数据库就没体现作用了, (2015-10-07 17:37) 

那就是你的逻辑不太对了,好好理理顺再写代码吧
离线德国蟑螂

只看该作者 17楼 发表于: 2015-10-07
回 圣域天子 的帖子
圣域天子:那就是你的逻辑不太对了,好好理理顺再写代码吧 (2015-10-07 18:03) 

可否加QQ私聊1363981327
快速回复
限100 字节
 
上一个 下一个