• 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.

VPS Starter Arubacloud
0 głosów
207 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,370 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,370 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ź 414 wizyt
pytanie zadane 2 marca 2016 w C i C++ przez chomek Gaduła (4,500 p.)
0 głosów
2 odpowiedzi 312 wizyt
pytanie zadane 7 listopada 2019 w C i C++ przez Jakub 0 Pasjonat (23,120 p.)
0 głosów
1 odpowiedź 936 wizyt

92,452 zapytań

141,262 odpowiedzi

319,077 komentarzy

61,854 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

Akademia Sekuraka 2024 zapewnia dostęp do minimum 15 szkoleń online z bezpieczeństwa IT oraz dostęp także do materiałów z edycji Sekurak Academy z roku 2023!

Przy zakupie możecie skorzystać z kodu: pasja-akademia - użyjcie go w koszyku, a uzyskacie rabat -30% na bilety w wersji "Standard"! Więcej informacji na temat akademii 2024 znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

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!

...