• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Qt, problem z połączeniem programu z bazą danych SQLite.

Object Storage Arubacloud
0 głosów
219 wizyt
pytanie zadane 27 lutego 2019 w C i C++ przez Jakub 0 Pasjonat (23,120 p.)

Hej, w Qt jestem początkujący i korzystam z tego poradnika:

https://www.youtube.com/watch?v=Qc9Smcr-huk&list=PLS1QulWo1RIZjrD_OLju84cUaUlLRe5jQ&index=8

Problem z kodem dotyczy tego filmu i dwóch następnych.

Oto co mam napisane:

plik nagłówkowy klasy okna:

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
#include <QtSql>
#include <QtDebug>
#include <QFileInfo>


namespace Ui {
class MainWindow;
}

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    explicit MainWindow(QWidget *parent = nullptr);
    ~MainWindow();

private slots:
    void on_pushButton_clicked();

private:
    Ui::MainWindow *ui;
    QSqlDatabase mydb;
};

#endif // MAINWINDOW_H

źródło:

#include "mainwindow.h"
#include "ui_mainwindow.h"

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    mydb=QSqlDatabase::addDatabase("QSQLITE");
    mydb.setDatabaseName("C:/database.db");

    if(!mydb.open()){
        ui->label->setText("Failed to open the database ( first time )");
    }else{
        ui->label->setText("connected...");
    }
}

MainWindow::~MainWindow()
{
    delete ui;
}

void MainWindow::on_pushButton_clicked()
{
    QString username, password;
    username = ui->lineEdit_username->text();
    password = ui->lineEdit_userpassword->text();

    if(!mydb.open()){
        qDebug()<<"Failed to open the database ( second time )\n";
        return;
    }

    QSqlQuery qry;

    if(qry.exec("select * from Users where Name='"+username+"' and passwd='"+password+"'")) {

        int count = 0;
        while(qry.next()){
            ++count;
        }

        if(count==1)
            ui->label->setText("username and password is correct.");
        if(count>1)
            ui->label->setText("Duplicate username and password.");
        if(count==0)
            ui->label->setText("username and password is incorrect.");
    }else {
        qDebug()<<"Failed to open the database ( third time )\n";
        return;
    }

}

Oto wynik wykonania programu:

Jak widać, dwa razy sprawdzamy czy udało się otworzyć bazę danych, co ciekawe nie ukazuje się komunikat że nie udało się tego dokonać niezależnie od tego czy baza danych ( plik *.db ) jest czy jej nie ma w określonej lokalizacji.

Dopiero w momencie wysłania zapytania:

 if(qry.exec("select * from Users where Name='"+username+"' and passwd='"+password+"'")) {

        int count = 0;
        while(qry.next()){
            ++count;
        }

        if(count==1)
            ui->label->setText("username and password is correct.");
        if(count>1)
            ui->label->setText("Duplicate username and password.");
        if(count==0)
            ui->label->setText("username and password is incorrect.");
    }else {
        qDebug()<<"Failed to open the database ( third time )\n";
        return;
    }

spełnia się warunek else... Nie mam pojęcia co zawaliłem, robiłem dokładnie tak jak w poradniku. Bardzo będę wdzięczny za pomoc w znalezieniu przyczyny.

pozdrawiam serdecznie :).

1 odpowiedź

+1 głos
odpowiedź 28 lutego 2019 przez Bondrusiek Maniak (61,410 p.)

Witam,

według mnie niepotrzebnie dwukrotnie otwierasz bazę danych. Możesz stworzyć flagę

bool ok = db.open();

bądź używać metody isOpen, która zwraca prawdę jeśli baza jest otwarta. Za Qt

Returns true if the database connection is currently open; otherwise returns false.

bool QSqlDatabase::isOpen() const

 

komentarz 28 lutego 2019 przez Jakub 0 Pasjonat (23,120 p.)

Dziękuje, zmieniłem kolejny warunek. Ale problem niestety wciąż pozostaje...

Może problem jest z samym zapytaniem:

 if(qry.exec("select * from Users where Name='"+username+"' and passwd='"+password+"'"))

Tyle że sprawdzałem kilka razy go, i wszystko mi się zgadza  :(

komentarz 28 lutego 2019 przez Bondrusiek Maniak (61,410 p.)

Według mnie niepotrzebnie używasz apostrofów. Spróbuj wykonać taką konstrukcje z C++

if(qry.exec("select * from Users where Name="+username+" and passwd="+password))

 

komentarz 1 marca 2019 przez Jakub 0 Pasjonat (23,120 p.)
nic :(

Nie mam zielonego pojęcia dlaczego tak jest dosłownie zawsze że wszystkim coś działa tylko mi jednemu nie...

Najwyżej opuszczę ten odcinek bo bazy danych i tak nie są mi teraz niezbędne.

Podobne pytania

0 głosów
1 odpowiedź 462 wizyt
pytanie zadane 2 marca 2016 w C i C++ przez chomek Gaduła (4,500 p.)
0 głosów
2 odpowiedzi 330 wizyt
pytanie zadane 7 listopada 2019 w C i C++ przez Jakub 0 Pasjonat (23,120 p.)
0 głosów
1 odpowiedź 1,052 wizyt

92,696 zapytań

141,607 odpowiedzi

320,114 komentarzy

62,056 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...