obsługa bazy danych

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

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.

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.

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;
}
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...

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

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?

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