Seite 1 von 1

QT kann MySQL Datenbank nicht öffnen

Verfasst: 18. September 2014 13:40
von Jannilein
Hallo,
ich habe das Problem das mein Programm einfach nicht meine Datenbank öffnen kann.
Mit dem Termial geht es, also läuft auch der Server und mein Passwort, Datenbankname , und alles sind richtig.
Jedoch bringt es immer wenn ich auf den Button klicke die Fehlermeldung : QSqlQuery::exec: database not open
Ich möchte mit dem Programm alle Daten aus einer Datenbank auslesen und in einer Tabelle in meinem Programm ausgeben.
Wo liegt mein Fehler .. ?
Hier ist mal mein ganzer bisheriger Code.
tester.h :

Code: Alles auswählen

#include <QtGui/QTableWidget>
#include <QtSql/QSqlQueryModel>
#ifndef TESTER_H_
#define TESTER_H_
class Tester : public QTableView
{
    Q_OBJECT
public:
    Tester();
    virtual ~Tester();
  void init();
  QTableWidget table;
  QSqlQueryModel *model;
  QSqlDatabase database;
  QTableView *meineView;
 public slots:
    void pushButtonClicked();
};
#endif /* TESTER_H_ */
hier die tester.cpp

Code: Alles auswählen

#include <QtCore/QString>
#include <QtGui/QApplication>
#include "mysql_connection.h"
#include <cppconn/driver.h>
#include <cppconn/exception.h>
#include <cppconn/resultset.h>
#include <cppconn/statement.h>
#include <QtSql/QSqlDatabase>
#include <QtGui/QTableWidget>
#include <QtGui/QPushButton>
#include "tester.h"
using namespace std;

int main(int argc, char **argv)
{
	 QApplication app (argc, argv);
	 Tester tester;
	 tester.init();
	 tester.show();
	 return app.exec();
}
Tester::Tester()
{
	model = new QSqlQueryModel();
	meineView = new QTableView();
	//database = new QSqlDatabase();
}
Tester::~Tester()
{
}
void Tester::init()
{
		 this->setGeometry(500,500,400,350);
		 meineView->setGeometry(QRect(20, 100, 361, 191));
		 database = QSqlDatabase::addDatabase("QMYSQL", "conn1");
		 //database->addDatabase("QMYSQL", "conn1");
		 database.setHostName("127.0.0.1");
		 database.setPort(3306);
		 database.setDatabaseName( "mydb" );
		 database.setUserName("root");
		 database.setPassword("testpasswort");
					if ( !database.open() )
					 	{
						qDebug("Couldn't open DB");
					 	}
		QPushButton* btnaddtotable = new QPushButton( "Load",this);
		btnaddtotable->setGeometry(50,20,100,40);
		btnaddtotable->show();
		QObject::connect ( btnaddtotable, SIGNAL ( clicked() ), this , SLOT(pushButtonClicked())) ;
}
void Tester::pushButtonClicked()
{
	if (database.open() )
	{
			model->setQuery("SELECT id, Nachname, Vorname, Ort FROM testtable");
			model->setHeaderData(0, Qt::Horizontal, tr("ID"));
			model->setHeaderData(1, Qt::Horizontal, tr("Nachnamme"));
			model->setHeaderData(2, Qt::Horizontal, tr("Vorname"));
			model->setHeaderData(3, Qt::Horizontal, tr("Ort"));
	} else
	{
		qDebug("Nicht geöffnet");
	}
			meineView->setModel(model);
}

Re: QT kann MySQL Datenbank nicht öffnen

Verfasst: 18. September 2014 19:53
von Christian81
Linux oder Windows? Ist der MySql-Treiber korrekt kompiliert und alle nötigen DLLs auch im Verzeichnis des Treibers vorhanden?

Re: QT kann MySQL Datenbank nicht öffnen

Verfasst: 22. September 2014 10:18
von Jannilein
Linux - Fedora 20 und ja.
Aber mein aktuelles Problem ist es, das ich nicht weiß wie ich nun die ganzen Inhalte der Datenbank in eine Tabelle in meiner QT Gui anzeige.

Re: QT kann MySQL Datenbank nicht öffnen

Verfasst: 22. September 2014 12:08
von MichaelS
Jannilein hat geschrieben:Linux - Fedora 20 und ja.
Aber mein aktuelles Problem ist es, das ich nicht weiß wie ich nun die ganzen Inhalte der Datenbank in eine Tabelle in meiner QT Gui anzeige.
Wenn die Datenbank nicht geöffnet werden kann, dann gibt es auch keine Inhalte. Um herauszufinden, warum die Datenbank nicht geöffnet werden kann, solltest Du die Fehlermeldungen der Datenbank auswerten:

Code: Alles auswählen

  if ( !database.open() )
  {
        QMessageBox::critical(this, "DB-Fehler", QString( "%1" ).arg( database.lastError().databaseText() );
        return; /* Abbrechen, wenn die Datenbank nicht geöffnet werden konnte */
  }
Außerdem solltest Du Dir angewöhnen, den Qt-Klassen einen Parent mitzugeben:

Code: Alles auswählen

   model = new QSqlQueryModel( this );
   meineView = new QTableView( this );
Wenn Du das nicht tust, musst Du in Deinem Destruktor dafür sorgen, dass der dafür reservierte Speicher auch wieder freigegeben wird. Da Du das nicht machst, produziert Dein derzeitiger Code Memory-Leaks.