Почему sqllite в то время как (query.next ()) {} не останавливает l oop? (Как остановить пока л oop) - PullRequest
0 голосов
/ 03 марта 2020

Я получил следующий пример кода.

Я добавил QT += sql в файл проекта в Qt Creator и рабочий файл minidb.db, и код выполняется правильно, печатает все записи до тех пор, пока l oop закончен и, как говорится в заголовке, не останавливается - true не меняет состояние на false каким-либо образом.

Почему это так и как я могу его улучшить? stopps? Я запускаю его на arch linux с sqlite3

#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 имеет этот пример без "== 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 ~]$ 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...