Problem z bazą danych



  • Cześć! Próbuję i próbuję i nie mogę dojść jak połączyć się z bazą danych. Doszedłem do tego na podstawie jednego z tutoriali:
    hh.pro
    @#-------------------------------------------------

    Project created by QtCreator 2013-12-01T18:42:56

    #-------------------------------------------------

    QT += core
    QT += sql
    QT -= gui

    TARGET = hh
    CONFIG += console
    CONFIG -= app_bundle

    TEMPLATE = app

    SOURCES += main.cpp
    @
    main.cpp
    @#include <QSqlDatabase>
    #include <QSqlQuery>
    #include <QDebug>
    #include <QString>

    int main(int argc, char *argv[])
    {
    QSqlDatabase db;
    db = QSqlDatabase::addDatabase("QSQLITE");
    db.setDatabaseName("fd.sqlite");

        if (!db.open())
        {
                qDebug() << "Błąd: nie można się połączyć z bazą!";
        }
        else
        {
                qDebug() << "Nawiązano połączenie z bazą danych.";
    
                QSqlQuery dodawanie;
                dodawanie.exec&#40;"INSERT INTO test (imie, nazwisko, wiek&#41; VALUES ('Stefan', 'Kowalski', '20')");
                dodawanie.exec&#40;"INSERT INTO test (imie, nazwisko, wiek&#41; VALUES ('Jan', 'Nowak', '36')");
    
                QSqlQuery pobieranie;
                pobieranie.exec&#40;"SELECT * FROM test"&#41;;
    
                while (pobieranie.next())
                {
                        QString imie = pobieranie.value(1).toString();
                        QString nazwisko = pobieranie.value(2).toString();
                        int wiek = pobieranie.value(3).toInt();
                        qDebug() << imie << nazwisko << wiek;
                }
        }
    
        return 0;
    

    }
    @

    i ciągle dostaję, że połączenie z bazą jest, ale nie mogę wykonać na niej operacji i nie chce mi zwrócić imienia, ani nazwiska, wie ktoś co z tym zrobić?


  • Moderators

    Całe Qt zakłada, że istnieje Singleton QCoreApplication. Bez niego, pochodne QObject nie będą działały! Także na początek polecam dodanie na początku:
    @
    #include <QCoreApplication>
    // ..
    QCoreApplication app(argc, argv);
    @

    A na końcu:
    @
    return app.exec();
    @



  • ok dzięki, plik wygląda tak:

    @
    #include <QCoreApplication>
    #include <QSqlDatabase>
    #include <QSqlQuery>
    #include <QDebug>
    #include <QString>

    int main(int argc, char *argv[])
    {
    QCoreApplication app(argc, argv);
    QSqlDatabase db;
    db = QSqlDatabase::addDatabase("QSQLITE");
    db.setDatabaseName("fgfgfd.sqlite");

        if (!db.open())
        {
                qDebug() << "Błąd: nie można się połączyć z bazą!";
        }
        else
        {
                qDebug() << "Nawiązano połączenie z bazą danych.";
    
                QSqlQuery dodawanie;
                dodawanie.exec&#40;"INSERT INTO test (imie, nazwisko, wiek&#41; VALUES ('Stefan', 'Kowalski', '20')");
                dodawanie.exec&#40;"INSERT INTO test (imie, nazwisko, wiek&#41; VALUES ('Jan', 'Nowak', '36')");
    
                QSqlQuery pobieranie;
                pobieranie.exec&#40;"SELECT * FROM test"&#41;;
    
                while (pobieranie.next())
                {
                        QString imie = pobieranie.value(1).toString();
                        QString nazwisko = pobieranie.value(2).toString();
                        int wiek = pobieranie.value(3).toInt();
                        qDebug() << imie << nazwisko << wiek;
                }
        }
    
        return app.exec();
    

    }
    @

    ale tak właściwie ciągle jednak jest źle, chyba muszę poszukać innego tutoriala



  • Stworzyłem kilka konsolowych aplikacji Qt4 i nie tworzyłem w nich instacji QCoreApplication.
    Tam gdzie używałem sqlite mam w setDatabaseName pełną ścieżkę do pliku bazy, czyli np. QDir::home().path() + dbName + ".sqlite" i działa.

    Acha... wartości pobierane z query liczymy od 0, więc imie to pobieranie.value(0), nazwisko (1), wiek (2).


Log in to reply
 

Looks like your connection to Qt Forum was lost, please wait while we try to reconnect.