Baza danych SQLITE nie działa z QT

0

Witam, mam taki o to kod:

void Supplies_menu::database_open()
{
    database = QSqlDatabase::addDatabase("QSQLITE");
    database.setDatabaseName("C:/Users/Mateusz/Desktop/SupplyManager v2/SupplyManagerV2/supplymanager.db");
    database.open();
    if(!database.isOpen())
    {
        QMessageBox::warning(this,"Database connection","Could not connect to database. Try to look for file supplymanager.db in folder with application.");
    }
}

void Supplies_menu::table_display()
{
    database.open();
    MySqlTableModel *model = new MySqlTableModel(this,database);
    model->setTable("products");
    model->select();
    model->setEditStrategy(QSqlTableModel::OnManualSubmit);
    model->mySetQuery(*query);
    query->exec("SELECT * FROM products");
    ui->tableView->setModel(model);
}

dotyczący tej bazy danych.
W konstruktorze używam obydwu voidów:

Supplies_menu::Supplies_menu(QWidget *parent) :
    QDialog(parent),
    ui(new Ui::Supplies_menu)
{
    database_open();
    ui->setupUi(this);
    table_display();
}

i po uruchomieniu aplikacji, pokazuje mi się

QSqlQuery::exec: database not open

Czytałem coś że dll-ów może brakować ale pobrałem najnowszy precompiled do sqlite3, wstawiłem chyba wszędzie gdzie się dało i nadal nic :/
Pomoże ktoś?

///HEADER

QSqlDatabase database; QSqlQuery *query = new QSqlQuery(database);

//// W ZAŁĄCZNIKU BAZA DANYCH

1

Obiekt klasy QSqlDatabase otwiera się tylko raz - wywal database.open() zewsząd oprócz metody open_database().

EDIT:
Odgrzebałem staaareńki (z 2009) projekt w którym używałem bazy danych SQLite w qt. Stworzyłem do tego następującą klasę:

class databaseAcessor : public QObject
{
    static databaseAcessor *instance;
	QSqlDatabase base;

	databaseAcessor(QObject *parent=0);
    
public:	
	QSqlQuery query;

	static databaseAcessor* getInstance(void);
};
#include "databaseacessor.h"

databaseAcessor::databaseAcessor(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);
	}
	QSqlQuery q(base);
	query=q;
}
databaseAcessor* databaseAcessor::getInstance(void)
{
	if(!instance) instance=new databaseAcessor();
	return instance;
}

Zwróć Bracie @Xezolpl uwagę na to co dzieje się po addDatabase(), powinno naprowadzić cię to na rozwiązanie.

0
MasterBLB napisał(a):

Obiekt klasy QSqlDatabase otwiera się tylko raz - wywal database.open() zewsząd oprócz metody open_database().

EDIT:
Odgrzebałem staaareńki (z 2009) projekt w którym używałem bazy danych SQLite w qt. Stworzyłem do tego następującą klasę:

class databaseAcessor : public QObject
{
    static databaseAcessor *instance;
	QSqlDatabase base;

	databaseAcessor(QObject *parent=0);
    
public:	
	QSqlQuery query;

	static databaseAcessor* getInstance(void);
};
#include "databaseacessor.h"

databaseAcessor::databaseAcessor(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);
	}
	QSqlQuery q(base);
	query=q;
}
databaseAcessor* databaseAcessor::getInstance(void)
{
	if(!instance) instance=new databaseAcessor();
	return instance;
}

Zwróć Bracie @Xezolpl uwagę na to co dzieje się po addDatabase(), powinno naprowadzić cię to na rozwiązanie.

No tak, zrobiłem tak jak ty masz ale to samo wychodzi

QSqlDatabase::addDatabase("QSQLITE");
    database = QSqlDatabase::database();

może ten path źle zapisuje?
u mnie jest tak:

database.setDatabaseName("C:/Users/Mateusz/Desktop/SupplyManager v2/SupplyManagerV2/supplymanager.db");

u ciebie jest wgl bez dysku itp. czyli po prostu dajesz ścieżke do obecnej czyli jak tam masz ten program w jakimś folderze to ścieżka prowadzi do folderu w tym folderze?
u mnie ten plik jest w tym samym miejscu co cpp i headery, czyli lecz nawet zmieniając nazwę ścieżki na samo supplymanager.db nadal nie działa. Nie mam pojęcia o co chodzi

  1. Może źle napisany jest plik .db ale raczej nie bo robiłem go przez DB browser i działał.
  2. Czytałem że jakichś sterowników może nie być i przez to sie ludziom nie łączyło ale pobrałem te najnowsze sterowniki, wrzuciłem serio do każdego folderu gdzie były .dll i nadal nic. Podpięte jest QT += sql i jest w headerze podpięte i QSql i QSqlDatabase

///EDIT
Ok znalazłem problem, chyba query wywoływane było w headerze bez jeszcze włączonej bazy danych, zmieniłem to. lecz model nadal nie zawiera treści, jedyne co się nie pokazuje już to komunikat że Database not opened

///EDIT 2
Dobra, nie ważne naszło mnie natchnienie - przeanalizowałem czyjś program z internetu z taką bazą i za wcześno wywołuję query - teraz działa. Mimo wszystko dziękuję za pomoc :)
Tylko mam pytanie czy ten select() wgl coś daje?

QSqlQuery *query = new QSqlQuery(database);
    query->exec("SELECT * FROM products");
    MySqlTableModel *model = new MySqlTableModel(this,database);
    model->setEditStrategy(QSqlTableModel::OnManualSubmit);
    model->mySetQuery(*query);
    ui->tableView->setModel(model);
    model->select();

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