QSqlDatabase with MYSQL management in the app
-
removeDatabaseis a static method.Take a look at the its documentation to see how to avoid having that warning message.
-
removeDatabaseis a static method.Take a look at the its documentation to see how to avoid having that warning message.
I have tried the static method also, the same warning message still exists.
Code (call to close db connection when app closes):
void Test2::closeDBConnection() { Database *db = new Database(); connect(db, &Database::finished, db, &Database::deleteLater); db->closeConnection(); } void Test2::closeEvent(QCloseEvent *event) { closeDBConnection(); event->accept(); QWidget::closeEvent(event); } -
Because you have somewhere in your code an instance of QSqlDatabase stored.
From your code, I'd say you have a QSqlDatabase database member variable in your Database class. Remove that.
-
Because you have somewhere in your code an instance of QSqlDatabase stored.
From your code, I'd say you have a QSqlDatabase database member variable in your Database class. Remove that.
What do you mean by removing
QSqlDatabasedatabase member variable? When I removed it, I will no longer open/restore or useQSqlDatabaseconnection.I have changed code to:
QSqlDatabase db = QSqlDatabase::database("TestConnection"); if (db.isOpen()) { db.close(); qDebug() << db.connectionName(); QSqlDatabase::removeDatabase(db.connectionName()); }The issue still exists, I think you are right about removing
QSqlDatabasemember variable, I still get it by callingQSqlDatabase::database("TestConnection")and then all checks will proceed. I will try it. -
Because you have somewhere in your code an instance of QSqlDatabase stored.
From your code, I'd say you have a QSqlDatabase database member variable in your Database class. Remove that.
I have deleted the
QSqlDatabasedatabase member variable, but the issue still exists. But I think I figured it out. I will test it and reply.Yes, it's finally working.
Code:
QSqlDatabase db = QSqlDatabase::database("TestConnection"); if (db.isOpen()) { QString dbConnectionName = db.connectionName(); db.close(); qDebug() << dbConnectionName; db = QSqlDatabase(); db.removeDatabase(dbConnectionName); // or QSqlDatabase::removeDatabase(dbConnectionName); } emit finished();And now I use the connection to the
DBuntil app closes or close it whenever I want. Also I would like to add, that I add check in the constructor and use database connection -QSqlDatabase db = QSqlDatabase::database("TestConnection");in the methods because different methods can execute in different situations, so it will always create or use the connection to database.Database::Database(QObject *parent) : QObject(parent) { if (!checkDBConnection()) { //Create db connection with the name "TestConnection" } } bool Database::checkDBConnection() { if (QSqlDatabase::contains("TestConnection")) { return true; } return false; }Thank you all.
-
Did you read the example code from the removeDatabase documentation I linked to earlier ?
-
Yes, but for some reason I need to dereference the database object (
db = QSqlDatabase();) to actually succeed with removing theDBconnection even with the static method, otherwise I get errorQSqlDatabasePrivate::removeDatabase: connection 'TestConnection' is still in use, all queries will cease to work.. -
Please show the complete code you are currently using.
You should also check if you have other QSqlDatabase objects lying around.
-
Please show the complete code you are currently using.
You should also check if you have other QSqlDatabase objects lying around.
I don't have any member variable, only local variable
QSqlDatabase db = QSqlDatabase::database("TestConnection");to get theDBconnection and use it to execute queries. It should deletes itself when it goes out of scope. So I think noQSqlDatabaseobjects are lying around.More info available - warning remove database
-
The correct way is described in the documentation of the function:
void someFunction() { { QSqlDatabase db = QSqlDatabase::database("sales"); QSqlQuery query("SELECT NAME, DOB FROM EMPLOYEES", db); } // Both "db" and "query" are destroyed because they are out of scope QSqlDatabase::removeDatabase("sales"); // correct }