[SOLVED] QSqlQueryModel macht Probleme bei Copy & Paste im Code mit MySQL
-
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? -
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. -
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());@
-
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.@ -
Hi,
du solltest - auch wenn's mühsam ist - im debug prüfen, was nach den Abfragen in welchem Query steht, z.B.:
@
qDebug() << qry.value(0).toString();
@Wenn das abgesichert ist, das gleiche mit den models:
@
qDebug() << model->data(model->index(0, 0)).toString();
@ -
Hallo,
hab jetzt mal ein kleines Testprogramm gemacht um vielleicht den Fehler leichter zu verstehen:
Datenbank Klasse:
@class Database
{public:
QSqlDatabase dbUser;
QSqlDatabase dbMemory;public:
Database();bool dbUserOpen(); void dbUserClose(); bool dbMemoryOpen(); void dbMemoryClose();};@
@bool Database::dbUserOpen()
{
QSettings settings("A.B.Solution","Memory");
settings.beginGroup("Einstellungen");
QString server = settings.value("Server").toString();
int port = settings.value("Port").toInt();
settings.endGroup();dbUser = QSqlDatabase::addDatabase("QMYSQL"); dbUser.setDatabaseName("DATENBANK1"); dbUser.setHostName(server); dbUser.setPort(port); dbUser.setUserName("USER"); dbUser.setPassword("PASSWORD"); if(!dbUser.open()) return false; else return true;}
void Database::dbUserClose()
{
dbUser = QSqlDatabase();
QSqlDatabase::removeDatabase(dbUser.connectionName());
}bool Database::dbMemoryOpen()
{
QSettings settings("A.B.Solution","Memory");
settings.beginGroup("Einstellungen");
QString server = settings.value("Server").toString();
int port = settings.value("Port").toInt();
settings.endGroup();dbMemory = QSqlDatabase::addDatabase("QMYSQL"); dbMemory.setDatabaseName("DATENBANK2"); dbMemory.setHostName(server); dbMemory.setPort(port); dbMemory.setUserName("USER"); dbMemory.setPassword("PASSWORD"); if(!dbMemory.open()) return false; else return true;}
void Database::dbMemoryClose()
{
dbMemory = QSqlDatabase();
QSqlDatabase::removeDatabase(dbMemory.connectionName());
}@Wenn ich mich anmelde:
@Database data;
user = ui->userEdit->text();
password = ui->passwordEdit->text();
int count = 0;if(!data.dbUserOpen()) QMessageBox::information(this,"Info","Fehler beim öffnen der Datenbank.\nBitte Verbindung oder IP-Adresse überprüfen."); else { QSqlQuery *qry = new QSqlQuery(data.dbUser); qry->prepare("SELECT * FROM userList WHERE user = '"+user+"'"); if(qry->exec()) { while(qry->next()) { userDB = qry->value(1).toString(); passwordDB = qry->value(2).toString(); data.dbUserClose(); count++; } } else { QMessageBox::critical(this,"MySQL Error",qry->lastError().text()); data.dbUserClose(); this->close(); } if(userDB == user && passwordDB == password && count == 1) { Menue men; this->close(); men.setModal(true); men.exec(); } else { QMessageBox::information(this,"Info","Login fehlgeschlagen. Bitte versuchen Sie es nochmal."); ui->userEdit->setText(""); ui->passwordEdit->setText(""); } }@Habe ich keinerlei Probleme. Speichere ich was in die andere Datenbank ab:
@Database data;
user = ui->userEdit->text();
password = ui->passwordEdit->text();
internetSite = ui->internetsiteLine->text();
tags = ui->tagsLine->text();if(!data.dbMemoryOpen()) QMessageBox::information(this,"Info","Fehler beim öffnen der Datenbank.\nBitte Verbindung oder IP-Adresse überprüfen."); else { QSqlQuery *qry = new QSqlQuery(data.dbMemory); qry->prepare("INSERT INTO internet (id,site,user,password,tags) VALUES (NULL,'"+internetSite+"','"+user+"','"+password+"','"+tags+"')"); if(qry->exec()) { data.dbMemoryClose(); ui->userEdit->setText(""); ui->passwordEdit->setText(""); ui->internetsiteLine->setText(""); ui->tagsLine->setText(""); } else { data.dbMemoryClose(); QMessageBox::critical(this,"MySQL Error",qry->lastError().text()); } }@Kommt wieder die Meldung:
@QSqlDatabasePrivate::addDatabase: duplicate connection name 'qt_sql_default_connection', old connection removed.@
Wie kann das sein? Hab ich irgendwo nen Code stehen der Funktioniert aber diesen Fehler produziert?
Gruß