Seite 1 von 1
Nutzung von 2 Datenbanken
Verfasst: 24. Januar 2007 12:03
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
Re: Nutzung von 2 Datenbanken
Verfasst: 24. Januar 2007 12:23
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.
Verfasst: 24. Januar 2007 12:47
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
Verfasst: 24. Januar 2007 12:53
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.
Verfasst: 24. Januar 2007 13:57
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
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();
}
Verfasst: 24. Januar 2007 14:05
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*
Verfasst: 24. Januar 2007 18:18
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
Verfasst: 24. Januar 2007 18:29
von Christian81
Das ist alles schon von Tarek beantwortet... auch wenn ich nicht wusste dass es in diesem speziellen Fall bei QSqlDatabase so geht.
Verfasst: 25. Januar 2007 07:51
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