为什么sqllite while(query.next()){}没有停止循环? (如何停止while循环)

时间:2020-03-03 15:19:25

标签: c++ sqlite qt

我有以下代码示例。

我在QT += sql中添加了项目文件 qt创建者和一个有效的minidb.db文件 并正确执行代码,打印所有条目,直到while循环结束为止,就像标题中所说的那样, 没有停止-true并没有以某种方式将状态更改为false

为什么会这样,如何改善它的阻塞?我使用sqlite3在arch linux上运行它

#include <QCoreApplication>
#include <QtSql>
#include <iostream>

int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);
    QSqlDatabase datenbank = QSqlDatabase::addDatabase("QSQLITE");
    datenbank.setDatabaseName("/home/jack/minidb.db");

    if(datenbank.open() == false)
    {
        std::cout << "DB not found\n";
        return 1;
    }

    QSqlQuery query;
    //query.prepare("SELECT * FROM descriptors WHERE id = ?"); //doesn't make a difference
    query.exec("SELECT * FROM adressen");


    while(query.next() == true) //not stopping
    {
        int nummer = query.value(0).toInt();
        std::cout << "Nummer: " << nummer << '\n';
        QString vorname = query.value(1).toString();
        std::cout << "Vorname: " << vorname.toStdString() << '\n';
        QString name = query.value(2).toString();
        std::cout << "Name: " << name.toStdString() << '\n';
        QString strasse = query.value(3).toString();
        std::cout << "Strasse: " << strasse.toStdString() << '\n';
        QString plz = query.value(4).toString();
        std::cout << "PLZ: " << plz.toStdString() << '\n';
        QString ort = query.value(5).toString();
        std::cout << "Ort: " << ort.toStdString() << '\n';
        QString telefon = query.value(6).toString();
        std::cout << "Telefon: " << telefon.toStdString() << '\n';
    }

    datenbank.close();

    return a.exec();
}

qt 5 documentation也有这个例子 没有“ == true”,但没有区别。

    QSqlQuery query("SELECT country FROM artist");
    while (query.next()) {
        QString country = query.value(0).toString();
        doSomething(country);
    }

我在做什么错?谢谢大家!

(我的项目文件,自动生成)

QT -= gui
QT += sql

CONFIG += c++11 console
CONFIG -= app_bundle

# The following define makes your compiler emit warnings if you use
# any Qt feature that has been marked deprecated (the exact warnings
# depend on your compiler). Please consult the documentation of the
# deprecated API in order to know how to port your code away from it.
DEFINES += QT_DEPRECATED_WARNINGS

# You can also make your code fail to compile if it uses deprecated APIs.
# In order to do so, uncomment the following line.
# You can also select to disable deprecated APIs only up to a certain version of Qt.
#DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0x060000    # disables all the APIs deprecated before Qt 6.0.0

SOURCES += \
        main.cpp

# Default rules for deployment.
qnx: target.path = /tmp/$${TARGET}/bin
else: unix:!android: target.path = /opt/$${TARGET}/bin
!isEmpty(target.path): INSTALLS += target

数据库条目:

    [jack@jacks ~]$ sqlite3 minidb.db
SQLite version 3.31.1 2020-01-27 19:55:54
Enter ".help" for usage hints.
sqlite> .database
main: /home/jack/minidb.db
sqlite> CREATE TABLE
   ...> adressen(
   ...> ;
Error: near ";": syntax error
sqlite> CREATE TABLE adressen (
   ...> aNummer INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL,
   ...> avorname TEXT NOT NULL,
   ...> anachname TEXT NOT NULL,
   ...> astrasse TEXT NOT NULL,
   ...> aplz TEXT NOT NULL,
   ...> aort TEXT NOT NULL,
   ...> atelefon TEXT);
sqlite> INSERT INTO adressen (avorname, anachname, astrasse, aplz, aort)
   ...> VALUES ('Erwin', 'Mueller', 'Hasenweg 16', '12345', 'Hasenhausen');
sqlite> INSERT INTO adressen (avorname, anachname, astrasse, aplz, aort)
   ...> VALUES ('Erna', 'Strobelt', 'Birnenplatz 1', '56789', 'Bullerbue');
sqlite> .database
main: /home/jack/minidb.db
sqlite> SELECT * FROM adressen;
1|Erwin|Mueller|Hasenweg 16|12345|Hasenhausen|
2|Erna|Strobelt|Birnenplatz 1|56789|Bullerbue|
sqlite> .exit
[jack@jacks ~]$ 

0 个答案:

没有答案