[SOLVED] QSqlQueryModel macht Probleme bei Copy & Paste im Code mit MySQL
-
Debug bringt beim start folgende Meldung:
@QSqlDatabasePrivate::removeDatabase: connection 'qt_sql_default_connection' is still in use, all queries will cease to work.
QSqlDatabasePrivate::addDatabase: duplicate connection name 'qt_sql_default_connection', old connection removed.
QSqlDatabasePrivate::addDatabase: duplicate connection name 'qt_sql_default_connection', old connection removed.
QSqlDatabasePrivate::addDatabase: duplicate connection name 'qt_sql_default_connection', old connection removed.@ -
Qt beschwert sich hier, dass die Datenbank noch geöffnet ist, die muss vor der erneuten Verwendung geschlossen werden:
@
data = QSqlDatabase();
QSqlDatabase::removeDatabase(db.connectionName());
@
Aber du schreibst, dass die Meldung beim Start erscheint?
An welcher Stelle?
Wenn ich richtig verstehe, möchtest du in EINER Datenbank zwei Abfragen öffnen... -
Am Anfang nach dem Benutzer:
@QSqlQuery *qry = new QSqlQuery(data.db2);
qry->prepare("SELECT * FROM userList WHERE user = '"+user+"' ");
if(qry->exec())
{
while(qry->next())
{
count++;
ipResponse = qry->value(2).toString();
userResponse = qry->value(1).toString();
}if(count == 0 && user != "" && user!= "Admin") { QMessageBox::information(this,"Nicht gefunden","User wurde nicht in der Datenbank gefunden.\nFragen Sie bei ihrem Admin nach."); } if(count == 1 && ipAddress == ipResponse && user == userResponse && user != "Admin") { data.db2.close(); LanControl con; this->close(); con.setModal(true); con.exec(); }@
Diese wird dann geschlossen. Also kann sie ja nicht offen sein?
-
Nach meiner Erfahrung funktioniert das mit db.close() nicht.
Versuche doch mal, data.db2.close() durch das zu ersetzen:
@
data.db2 = QSqlDatabase();
QSqlDatabase::removeDatabase(data.db2.connectionName());
@
Und noch eine Frage: Musst du die Datenbank an der Stelle schließen? -
diese Datenbank brauch ich nur einmalig um den User mit der IP zu vergleichen die in der Datenbank hinterlegt ist um das Login zu gewähren. Ansonsten nicht mehr. Soll ich sie dann offen lassen falls ich mit der Datenbank mehr mache?
-
Wenn die Datenbank nicht mehr benötigt wird, solltest du sie schließen, aber versuche das mit den beiden Befehlen.
(Die Funktion sollte aber auch trotz der Fehlermeldungen gewährleistet sein - so war's zumindest in meinen Programmen.) -
Verwende für dieses Programm 3 Datenbanken. 1 User DB 1 Message DB und eine Software DB.
Wenn ich in alle drei immer was brauche soll ich sie dann offen lassen oder Schließen?
Programm holt sich von der User DB einen Namen um diesen mit einer Nachricht in die Message DB zu schreiben.
Wieso klappt der befehl:@data.db2.close()@
nicht so gut?
-
Die Information zum Schließen habe ich vor längerer Zeit hier im Forum "z.B. hier: "https://qt-project.org/forums/viewthread/16417gefunden, nachdem ich exakt das gleiche Problem hatte.
Generell zum Schließen:
Ich würde die Datenbanken geöffnet lassen, das sollte keine Leistungsprobleme verursachen. -
Wollte gerade deinen Link anschauen und bekomme folgende Meldung:
Notice
The following errors were encountered
There is no content to display on this link or it has restricted access. -
Das Kopieren hat nicht geklappt...
"Korrektur: ":https://qt-project.org/forums/viewthread/16417 -
Ah okay. Klingt sehr interessant was er da gepostet hat. Also die Datenbank so sauber schließen wie du es vorher gezeigt hast.
Am besten baue ich mein Programm auf eine DB um aber mit mehr Tabellen. Dann kann ich die Verbindung offen lassen in dem Fall.In dem ich folgende Funktion ausführe öffne ich ja eine Verbindung zur DB:
@bool db1Open();@
Funktion selber:
@bool Database::db1Open()
{
QSettings settings("SETTINGS");
settings.beginGroup("Einstellungen");
QString server = settings.value("Server").toString();
int port = settings.value("Port").toInt();
settings.endGroup();db1 = QSqlDatabase::addDatabase("QMYSQL"); db1.setDatabaseName("DB"); db1.setHostName(server); db1.setPort(port); db1.setUserName("NAME"); db1.setPassword("PASSWORD"); if(!db1.open()) return false; else return true;
}@
Und wenn ich Sie nicht mehr brauche dann schließen mit folgendem Code:
@QSqlDatabase::removeDatabase(data.db1.connectionName());@
-
Das Öffnen ist völlig korrekt - zum Schließen solltest du das QSQlDatabase Objekt vor dem removeDatabase noch leeren.
Sieht dann so aus:@
data.db1. = QSqlDatabase();
QSqlDatabase::removeDatabase(data.db1.connectionName());
@ -
Ah vergessen :) gleich probieren. Danke ;)
-
So sieht meine Close-Funktion aus:
@void Database::db1Close()
{
db1 = QSqlDatabase();
QSqlDatabase::removeDatabase(db1.connectionName());
}@Aber das Problem besteht immer noch :(
@Access is denied.
QSqlDatabasePrivate::addDatabase: duplicate connection name 'qt_sql_default_connection', old connection removed.
QSqlDatabasePrivate::removeDatabase: connection 'qt_sql_default_connection' is still in use, all queries will cease to work.
QSqlDatabasePrivate::addDatabase: duplicate connection name 'qt_sql_default_connection', old connection removed.
QSqlDatabasePrivate::addDatabase: duplicate connection name 'qt_sql_default_connection', old connection removed.@ -
Ich würde jetzt im Debug-Modus diese Stelle Schritt für Schritt untersuchen.
Die Meldung "Access is denied" bezieht sich wahrscheinlich auf den User? -
Jetzt hab ich mit etwas anderen einen hässlichen Fehler. Ich muss seit einem Update von Windows alle neue Projekt mit Adminrechten starten sonst geht das Programm nicht auf.
-
Meldung:
@Failed to start program. Path or permissions wrong?@
Ist aber alles richtig -
Ich lege ein ganz neues Projekt an und der Creator macht das alles richtig aber ich habe immer das kleine Wappen von Win7 wenn etwas Adminrechte braucht. Was das für ne scheiße
-
Hi Alex,
das ist sicher ein Problem mit den Einstellungen von Win7.
Google doch mal nach "Win7 Update Admin" -
Hi,
Danke hat geholfen. Nun geht es wieder. Sau blöder Fehler xD
Aber nun zurück zum Fehler das er den Inhalt vom TableView verliert ;)