Qt не читает Sqlite - PullRequest
0 голосов
/ 25 мая 2020

Я использую fedora linux и хотел попробовать sqlite
Я не понимаю, что здесь не так ... Я сделал простую базу данных и хотел показать ее содержимое.

#include <QCoreApplication>
#include <QSqlDatabase>
#include <QSqlQuery>
#include <QSqlError>
#include <QDebug>

int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);
    if (!QSqlDatabase::isDriverAvailable("QSQLITE"))
    {
        qDebug() << "Error on init";
        return -1;
    }

    QSqlDatabase bd = QSqlDatabase::addDatabase("QSQLITE");
    bd.setDatabaseName("Students.db");
    if (!bd.open())
    {
        qDebug() << bd.lastError().text();
        return -2;
    }

    QSqlQuery q;
    if (!q.exec("create table if not exists students"
           "(id integer not null primary key autoincrement,"
           " name varchar(255) not null,"
           " age integer not null)"))
    {
        qDebug() << q.lastError().text();
        return -3;
    }

    q.exec("insert into students (name, age) values ('Renato', 24 )");
    q.exec("insert into students (name, age) values ('Olive', 40 )");
    q.exec("insert into students (name, age) values ('Cucuo', 19 )");
    q.exec("insert into students (name, age) values ('Renzen', 32 )");
    q.exec("insert into students (name, age) values ('Polai', 21 )");
    q.exec("insert into students (name, age) values ('Mogo', 29 )");

    q.exec("select * from students");
    while (q.next())
    {
        qDebug() << q.value("id").toInt();
        qDebug() << q.value("name").toString();
        qDebug() << q.value("age").toInt();
    }

    bd.close();
    return a.exec();
}

Программа отлично компилируется без ошибок и просто показывает мне пустую консоль, ни одна строка не запрашивается.

Обновление

Я могу получить доступ к базе данных через командную строку, и это показывает, что запросы выполнены успешно.
теперь мне интересно, правильно ли работает функция qDebug()

1 Ответ

0 голосов
/ 25 мая 2020

Ваш запрос вставки недействителен. if not exists нельзя использовать во вставке запроса. Вы можете увидеть lastError (). Text () после вставки запросов. Затем, если вы удалите части if not exists во всех запросах вставки, все будет хорошо. Однако кажется, что вы не хотите вставлять повторяющиеся значения. Правильно? Если это так, вы должны определить столбец «имя» как «уникальный» столбец. Таким образом, если студент уже вставлен, он никогда не будет дублироваться при запросах на вставку.

if (!QSqlDatabase::isDriverAvailable("QSQLITE"))
{
    qDebug() << "Error on init";
    return -1;
}
qDebug() << "1";
QSqlDatabase bd = QSqlDatabase::addDatabase("QSQLITE");
bd.setDatabaseName("Students.db");
if (!bd.open())
{
    qDebug() << bd.lastError().text();
    return -2;
}
qDebug() << "2";
QSqlQuery q;
if (!q.exec("create table if not exists students"
       "(id integer not null primary key autoincrement,"
       " name varchar(255) not null unique,"
       " age integer not null)"))
{
    qDebug() << q.lastError().text();
    return -3;
}
qDebug() << "3";
q.exec("insert into students (name, age) values ('Renato', 24 )");
q.exec("insert into students (name, age) values ('Olive', 40 )");
q.exec("insert into students (name, age) values ('Cucuo', 19 )");
q.exec("insert into students (name, age) values ('Renzen', 32 )");
q.exec("insert into students (name, age) values ('Polai', 21 )");
q.exec("insert into students (name, age) values ('Mogo', 29 )");
qDebug() << "4";
q.exec("select * from students");
while (q.next())
{
    qDebug() << q.value("id").toInt();
    qDebug() << q.value("name").toString();
    qDebug() << q.value("age").toInt();
}
qDebug() << "5";
bd.close();
return 0;

Результат будет следующим: Output

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...