我有以下代码示例。
我在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 ~]$