Nutzung von 2 Datenbanken

Alles rund um die Programmierung mit Qt
Antworten
yellow1
Beiträge: 4
Registriert: 12. November 2006 14:36

Nutzung von 2 Datenbanken

Beitrag von yellow1 »

Hallo Leute,
ich möchte in meinem Programm 2 verschiedene Datenbanken nutzen. Da habe ich in einem Buch gelesen, daß man beim erzeugen der Verbindung als zweites Argument einen Namen vergeben kann, den man später einem Zeiger zuordnet. Ich habe daß wie folgt probiert, bekomme aber immer den Fehler "QSqlDatabase mySqlDB = QSqlDatabase::database("sql");"

Hier ist der Quellcode den ich habe:

void dataCall::connectMYSQLDB()
{
QSqlDatabase mySqlDB = QSqlDatabase::addDatabase("QMYSQL",
"sql");
QSqlDatabase mySqlDB = QSqlDatabase::database("sql");
mySqlDB.setHostName(host);
mySqlDB.setDatabaseName(database);
mySqlDB.setUserName(username);
mySqlDB.setPassword(dbpasswd);

if (mySqlDB.open())
{
QMessageBox::information(0,(""),"Die Verbindung zur SQL-Datenbank wurde hergestellt");
}
else
{
QMessageBox::information(0,(""),"Die Verbindung zur SQL-Datenbank konnte nicht hergestellt werden");
}

}

Vielleicht kann mir jemand sagen was ich falsch mache.

Danke
yellow1
Christian81
Beiträge: 7319
Registriert: 26. August 2004 14:11
Wohnort: Bremen
Kontaktdaten:

Re: Nutzung von 2 Datenbanken

Beitrag von Christian81 »

yellow1 hat geschrieben: Vielleicht kann mir jemand sagen was ich falsch mache.
Du solltest mal C(++) lernen - wie soll das funktionieren?
Man kann keine 2 Variablen mit gleichen Namen innerhalb einer Funktion benutzen... des Weiteren sind beide Connections nach dem Beenden Deiner Funktion wieder weg.
MfG Christian

'Funktioniert nicht' ist keine Fehlerbeschreibung
yellow1
Beiträge: 4
Registriert: 12. November 2006 14:36

Beitrag von yellow1 »

Hi Christian,
ich rufe die Funktionen beim erstellen meiner Klasse auf und somit sind sie, mindestens so lange wie die Klasse besteht, vorhanden. Daß habe ich schon richtig gemacht und die Verbindung zur Datenbank bleibt bestehen.
Meine Frage ist halt nur wie ich den Quellcode richtig schreibe, damit ich 2 verschiedene Datenbanken( MySql & Access ) verwenden kann. Diese Zeilen , stehen so in dem Buch "C++ GUI Programmierung mit QT4" von Addison-Wessley. Daß ist aber ja anscheinend ein Druckfehler.

MFG
yellow1
Christian81
Beiträge: 7319
Registriert: 26. August 2004 14:11
Wohnort: Bremen
Kontaktdaten:

Beitrag von Christian81 »

yellow1 hat geschrieben:Hi Christian,
ich rufe die Funktionen beim erstellen meiner Klasse auf und somit sind sie, mindestens so lange wie die Klasse besteht, vorhanden.
Falsch
Meine Frage ist halt nur wie ich den Quellcode richtig schreibe, damit ich 2 verschiedene Datenbanken( MySql & Access ) verwenden kann. Diese Zeilen , stehen so in dem Buch "C++ GUI Programmierung mit QT4" von Addison-Wessley. Daß ist aber ja anscheinend ein Druckfehler.
Selbst wenn sie dort so stehen würden, dann wohl nicht in diesem Kontext. Nochmal: Es ist nicht möglich, 2 Variablen in einer Funktion den gleichen Namen zu geben.
MfG Christian

'Funktioniert nicht' ist keine Fehlerbeschreibung
Tarek
Beiträge: 46
Registriert: 3. Oktober 2005 14:29
Kontaktdaten:

Beitrag von Tarek »

yellow1 hat Folgendes geschrieben:
Hi Christian,
ich rufe die Funktionen beim erstellen meiner Klasse auf und somit sind sie, mindestens so lange wie die Klasse besteht, vorhanden.

Falsch
Yellow hat zwar scheinbar das Wesen des Stacks noch nicht so ganz erkannt und macht folglich falsche Überlegungen, das Resultat ist aber wie ich meine hier zufällig richtig, denn die Zerstörung von mySqlDB bedeutet ja nicht das die Verbindung weg ist. QSqlDatabase ist nur als eine Art Zeiger oder Handle zu verstehen, das man sich jeder Zeit mit der statischen Funktion QSqlDatabase::database(...) wiederbeschaffen kann.

So wie ich das sehe ist zunächst mal die Zeile

Code: Alles auswählen

QSqlDatabase mySqlDB = QSqlDatabase::database("sql");
dort wo sie jetzt steht vollends überflüssig und natürlich auch syntaktisch völliger Unsinn.
Meine Frage ist halt nur wie ich den Quellcode richtig schreibe, damit ich 2 verschiedene Datenbanken( MySql & Access ) verwenden kann

Code: Alles auswählen

void dataCall::connectMYSQLDB()
{
QSqlDatabase mySqlDB = QSqlDatabase::addDatabase("QMYSQL","sql");
mySqlDB.setHostName(sqlhost);
mySqlDB.setUserName(sqlusername);
mySqlDB.setPassword(sqldbpasswd); 

mySqlDB = QSqlDatabase::addDatabase("QODBC","access");
mySqlDB.setHostName(accesshost);
mySqlDB.setUserName(accessusername);
mySqlDB.setPassword(accessdbpasswd);

QSqlDatabase::database("sql").open();
QSqlDatabase::database("access").open();

}
Christian81
Beiträge: 7319
Registriert: 26. August 2004 14:11
Wohnort: Bremen
Kontaktdaten:

Beitrag von Christian81 »

Tarek hat geschrieben:Yellow hat zwar scheinbar das Wesen des Stacks noch nicht so ganz erkannt und macht folglich falsche Überlegungen, das Resultat ist aber wie ich meine hier zufällig richtig, denn die Zerstörung von mySqlDB bedeutet ja nicht das die Verbindung weg ist. QSqlDatabase ist nur als eine Art Zeiger oder Handle zu verstehen, das man sich jeder Zeit mit der statischen Funktion QSqlDatabase::database(...) wiederbeschaffen kann.
Aua - wie kann man nur sowas zulassen... das bringt ja einen Qt-Anfänger noch mehr durcheinander -> Warum kann ich mit QWidget meinWidget = QWidget("Test") nicht das QWidget ansprechen welches ich im ctor erstellt habe?
Nunja, ist eh zu spät sobald ich beim connect einen anderen Namen benutze und es an einer Stelle bei QSqlDatabase::database(...) vergesse zu ändern :)

*wunderüberQSqlDatabase*
MfG Christian

'Funktioniert nicht' ist keine Fehlerbeschreibung
yellow1
Beiträge: 4
Registriert: 12. November 2006 14:36

Beitrag von yellow1 »

Naja, abgesehen was ich ja laut Christian alles falsch gemacht habe, bedanke ich mich erstmal bei Tarek, der es wenigstens versucht mir zu helfen.
Doch leider ist mein Problem damit noch immer nicht gelöst.

Die Frage ist nun, wie ich dann im Bedarfsfall die jeweilige Datenbank meinem da erzeugtem QSqlQuery zuweise, damit ich die richtigen Tabellen auslesen kann ?

Und ist es überhaupt möglich die Verbindung in der einen Funktion zu erzeugen und dann später in einer seperaten Funktion die dazugehörigen Querys?

Danke
yellow1
Christian81
Beiträge: 7319
Registriert: 26. August 2004 14:11
Wohnort: Bremen
Kontaktdaten:

Beitrag von Christian81 »

Das ist alles schon von Tarek beantwortet... auch wenn ich nicht wusste dass es in diesem speziellen Fall bei QSqlDatabase so geht.
MfG Christian

'Funktioniert nicht' ist keine Fehlerbeschreibung
MichaelS
Beiträge: 240
Registriert: 27. Dezember 2005 12:49

Beitrag von MichaelS »

Die Frage ist nun, wie ich dann im Bedarfsfall die jeweilige Datenbank meinem da erzeugtem QSqlQuery zuweise, damit ich die richtigen Tabellen auslesen kann ?
In dem Du dem QSqlQuery im Konstruktor mitteilst, welche Datenbank verwendet werden soll:

Code: Alles auswählen

QSqlQuery::QSqlQuery ( const QString & query = QString(), QSqlDatabase db = QSqlDatabase() )
Gruß Michael
Antworten