obsługa bazy danych

Odpowiedz Nowy wątek
2011-09-17 20:30
0

witam, potrzebuję obsłużyć bazę danych przy pomocy QT (c++). Mam jednak problem bo kompilator rzuca niezdefiniowaną referencją. Mam takie nieodparte wrażenie, że coś przeoczyłem, o czymś zapomniałem jednak nie mogę złapać gdzie. Wklejam więc kod klasy w nadziei, że ktoś podpowie gdzie co zrobiłem źle:

class Sql
{
public:
    Sql(QSqlDatabase *database, QString User, QString password, QString ip, int port, QString table);
    ~Sql();
private:
    QSqlDatabase *db;
    std::vector <QString> bufor;
    void setConnection();
};

kod konstruktora:

Sql::Sql(QSqlDatabase *database, QString user, QString password, QString ip, int port, QString table)
{
    db=database;
    db=new QSqlDatabase::addDatabase("QMYSQL"); //tu mu nie pasi.
} 

kompilator mi zarzuca "undefined reference to QSqlDatabase::~QSqlDatabase()"
ponadto powinno być QSqlDatabase *&database ale to jest mniej istotne w tej chwili. W pliku z nagłówkiem klasy zawarłem QtSql/QSqlDatabase

edytowany 1x, ostatnio: Puchaczov, 2011-09-17 20:33

Pozostało 580 znaków

2011-09-17 20:50
0

addDatabase() zwraca obiekt QSqlDatabase, tak więc tamto new jest złe. Co właściwie ma robić tworzona przez Ciebie klasa? Na mój gust idziesz w złym kierunku. Połączenie z bazą jest rozpoznawalna po nazwie. Można zrobić np. tak:

QSqlDatabase db = QSqlDatabase::addDatabase( "STEROWNIK", "NAZWA_POLACZENIA" );

Jeśli nie podasz nazwy to wtedy takie połączenie jest domyślne. By dostać obiekt QSqlDatabase robisz:

QSqlDatabase db = QSqlDatabase::database( "NAZWA_POLACZENIA" );

Jeśli wywołasz QSqlDatabase::database() bez nazwy to masz zwrócone domyślne połączenie.


Jeśli uważasz mój post za wartościowy - daj punkt.
Mój post pomógł Ci rozwiązać problem - zaznacz go.

Pozdrawiam

Pozostało 580 znaków

2011-09-17 20:54
0

do konstruktora potrzebuję przekazać wskaźnik na QSqlDatabase, w środku klasy utworzyć obiekt, zrobić na nim operacje pobierania danych i mieć tą operacje widoczną na zewnątrz klasy.

chciałem sprawdzić jak to się zachowa jak podmienię troszke konstruktor:
//plik.h

 Sql(QSqlDatabase database, QString User, QString password, QString ip, int port, QString table); 
//plik .cpp
Sql::Sql(QSqlDatabase database, QString user, QString password, QString ip, int port, QString table)
{
    QSqlDatabase db = QSqlDatabase::addDatabase( "STEROWNIK", "NAZWA_POLACZENIA" );
}

i ciągle rzuca tym samym błędem.

edytowany 1x, ostatnio: Puchaczov, 2011-09-17 21:03

Pozostało 580 znaków

2011-09-17 21:05
0

Mam dziś dobry humor,to w drodze wyjątku zapodam gotowy kod jaki stosuję do baz danych w Qt:
databaseaccessor.h

class DatabaseAccessor : public QObject
{
    Q_DISABLE_COPY(DatabaseAccessor)

    static DatabaseAccessor *instance;
    QSqlDatabase base;

    DatabaseAccessor(QObject *parent=0);

public: 
   QSqlQuery query;

   static DatabaseAccessor* getInstance(void);
};

i databaseaccessor.cpp

#include<QSqlDatabase>
#include<QSqlQuery>
#include<QSqlError>
#include<QMessageBox>
#include<QVariant>
#include "databaseacessor.h"

DatabaseAccessor::DatabaseAccessor(QObject *parent):QObject(parent)
{
    QSqlDatabase::addDatabase("QSQLITE");   
    base=QSqlDatabase::database();
    //in the future this path shoud be taken from options-in case of other cardgames support
    base.setDatabaseName("Databases/Magic/cards.db");
    if(!base.open())
    {
        QMessageBox::warning(NULL,tr("Error during opening cards' database!"),base.lastError().text(),QMessageBox::Ok);
        exit(0);
    }
    query=QSqlQuery(base);
}
DatabaseAccessor* DatabaseAccessor::getInstance(void)
{
    if(!instance) instance=new DatabaseAccessor();
    return instance;
}

"Sugeruję wyobrazić sobie Słońce widziane z orbity Merkurego, a następnie dupę tej wielkości. W takiej właśnie dupie specjalista ma teksty o wspaniałej atmosferze, pracy pełnej wyzwań i tworzeniu innowacyjnych rozwiązań. Pracuje się po to, żeby zarabiać, a z resztą specjalista sobie poradzi we własnym zakresie, nawet jeśli firma mieści się w okopie na granicy obu Korei."
-somekind,
konkretny człowiek-konkretny przekaz :]
edytowany 1x, ostatnio: MasterBLB, 2011-09-19 12:55

Pozostało 580 znaków

2011-09-17 21:13
0

Dzięki. Problem jednak polega na tym, że nawet taki konstruktor wywala ten błąd

SQL::SQL(QString user, QString password, QString ip, int port, QString table)
{

}

chciałbym dociec dlaczego tak jest.

EDIT: Twój kod wywala mnóstwo "undefined reference to..." problem leży więc po stronie QT, jego błędnej konfirguracji?. W projekcie mam QT += qsql. Czy tak to powinno wyglądać?

EDITKA:

działa, oczywiście problemem było, że zamiast QT += qsql trzeba było wrzucić QT += sql ... irytujące...

edytowany 3x, ostatnio: Puchaczov, 2011-09-17 21:54
Musisz go przerobić.Ot na przykład ścieżka do pliku bazy danych będzie inna zapewne.Poza tym widzisz,że jest składnik statyczny,to trzeba go gdzieś zdefiniować DatabaseAccessor *DatabaseAccessor::instance=0; - MasterBLB 2011-09-17 21:41
tu chyba nie o to chodzi. Utworzyłem czysty projekt i wrzuciłem to o czym pisał Hostel i zawsze wyrzuca to samo. Czy mógłbyś utworzyć projekt który się kompiluje (jakiś bardzo krótki - samo połączenie) i wrzucić do sieci?. Bo albo ja sobie tego nie potrafię zrobić albo coś jest skopane. - Puchaczov 2011-09-17 21:49

Pozostało 580 znaków

2011-09-17 22:20
0

Cóż,wpierw podstawa-upewnij się,że na pewno masz dllkę od mysqla w QTDIR\plugins\sqldrivers,a najlepiej to zapodaj linijkę qDebug()<<QSqlDatabase::drivers() i obacz,czy na liście jest MySQL


"Sugeruję wyobrazić sobie Słońce widziane z orbity Merkurego, a następnie dupę tej wielkości. W takiej właśnie dupie specjalista ma teksty o wspaniałej atmosferze, pracy pełnej wyzwań i tworzeniu innowacyjnych rozwiązań. Pracuje się po to, żeby zarabiać, a z resztą specjalista sobie poradzi we własnym zakresie, nawet jeśli firma mieści się w okopie na granicy obu Korei."
-somekind,
konkretny człowiek-konkretny przekaz :]
edytowany 1x, ostatnio: MasterBLB, 2011-09-19 13:00

Pozostało 580 znaków

2011-09-18 15:55
uuu
0
MasterBLB napisał(a)

Mam dziś dobry humor,to w drodze wyjątku zapodam gotowy kod jaki stosuję do baz danych w Qt:
databaseaccessor.h


class DatabaseAccessor : public QObject
{
static DatabaseAccessor *instance;
QSqlDatabase base;
DatabaseAccessor(QObject *parent=0);

public:
QSqlQuery query;

static DatabaseAccessor* getInstance(void);

};



A konstruktora kopiującego i operatora przypisania nie przeciążasz zwykle w tym singletonie?
Robię Q_DISABLE_COPY(class) które to właśnie czyni.Dzięki za zwrócenie uwagi,kurczę strasznie stary kod wkleiłem. - MasterBLB 2011-09-19 12:54

Pozostało 580 znaków

Odpowiedz
Liczba odpowiedzi na stronę

1 użytkowników online, w tym zalogowanych: 0, gości: 1, botów: 0