как получить доступ к разным таблицам из одной базы данных одновременно - PullRequest
0 голосов
/ 26 апреля 2018

Я использую Qt5 и Sqlite3. Я делаю функцию журнала. У меня есть две таблицы, все книги определены как:

CREATE TABLE IF NOT EXISTS allBooks (NAME VARCHAR(100) UNIQUE, AUTHOR VARCHAR(100) NOT NULL, UID VARCHAR(100) UNIQUE, QUANTITY INT NOT NULL);

и журнал, который определяется как:
CREATE TABLE IF NOT EXISTS log (STUDENT VARCHAR(100) NOT NULL, UID VARCHAR(100) NOT NULL, ISSUED CHAR(11) NOT NULL, RETURNED CHAR(11) NOT NULL);

Конструктор моего диалогового окна журнала, который показывает журнал в виде списка, показан ниже:

model = new QStringListModel(this);

QStringList list;

QSqlQuery query1, query2;

query1.exec("SELECT * FROM log");

while(query1.next())
{
    QSqlRecord rec = query1.record();

    QString student = rec.value(0).toString(),
            uid = rec.value(1).toString(),
            issued = rec.value(2).toString(),
            returned = rec.value(3).toString();

    if(query2.exec("SELECT NAME FROM allBooks WHERE UID = " + uid))
        uid = query2.record().value(0).toString();
    else
        QMessageBox::critical(this, "Oops:", query2.lastError().text());

    if(returned == "Not yet returned")
        list << student + " issued " + uid + " on " + issued + " which is not returned yet";
    else
        list << student + " issued " + uid + " on " + issued + " and returned it on " + returned;
}

if(list.size() == 0)
{
    QMessageBox::critical(this, "Well...", "It seems that no book is issued");
    valid = false;
}
else
{
    model->setStringList(list);

    ui->listView->setModel(model);
}

Суть цикла в том, что у меня есть UID книги. Я хочу знать название книги, чей UID у меня есть. Но я не знаю, как это сделать. Проблема в том, что в выходных данных название книги не отображается и ни одной ошибки. Обе таблицы находятся в одной базе данных. Как я могу получить доступ к таблицам allBooks в цикле, не влияя на query1?

1 Ответ

0 голосов
/ 26 апреля 2018

Вы должны вызвать функцию типа query2.next(), чтобы перейти к первой возвращенной записи.

В любом случае, было бы проще разрешить базе данных объединять таблицы:

SELECT *
FROM log
JOIN allBooks USING (UID);
...