using model to fill tableView with QMYSQL
-
wrote on 27 May 2021, 16:35 last edited by
I ran into huge problem at the end of the project.
I was using sqlite as the database at the starting of the project. Configured mysql database and liked it so I decided to use it.
Everything is working absolutely fine except one
Filling The datas in tableView using model
I am getting the data but it is empty.
And fetching in text Edit works so fine.
Using the same queries everything is working but filling doesnot work , See in the picture even the query is working and detecting that there are two datas but they aren't filled
WHYWhat can I do to solve this?
Plz I would be very thankfull -
I ran into huge problem at the end of the project.
I was using sqlite as the database at the starting of the project. Configured mysql database and liked it so I decided to use it.
Everything is working absolutely fine except one
Filling The datas in tableView using model
I am getting the data but it is empty.
And fetching in text Edit works so fine.
Using the same queries everything is working but filling doesnot work , See in the picture even the query is working and detecting that there are two datas but they aren't filled
WHYWhat can I do to solve this?
Plz I would be very thankfullwrote on 27 May 2021, 17:49 last edited by@Thank-You said in using model to fill tableView with QMYSQL:
Filling The datas in tableView using model
Can you show your code?
-
wrote on 27 May 2021, 17:55 last edited by
Just to cover the bases, did you create a QSqlTableModel with the SQL database, then pass it into your TableView? Did you set a table?
Here's how I have mine setup:
_database = loadDatabase("postgres"); //There is more code in this function, but I assume yours is correct. _tableModel = new QSqlTableModel(this,_database); _tableModel->setTable(tableName); _tableModel->setEditStrategy(QSqlTableModel::OnFieldChange); _tableModel->select(); ui->tableView->setModel(_tableModel);
I hope this helps.
-
@Thank-You said in using model to fill tableView with QMYSQL:
Filling The datas in tableView using model
Can you show your code?
wrote on 28 May 2021, 03:25 last edited by Thank YouQString command = "select * from countryDetails;"; { QSqlDatabase db = QSqlDatabase::addDatabase("QMYSQL"); db.setDatabaseName(databaseName); db.setPort(databasePort); db.setHostName(databaseHostname); db.setUserName(databaseUsername); db.setPassword(databasePassword); db.open(); if(db.open()){ QSqlQueryModel *model = new QSqlQueryModel(); QSqlQuery *query = new QSqlQuery(db); query->prepare(command); if(query->exec()){ model->setQuery(*query); ui->information->setModel(model); //setting the model }else{ QMessageBox::warning(this,data.ERRORS.DATABASE_SELECT_NOT_WORKING_TITLE("CF"),data.ERRORS.DATABASE_SELECT_NOT_WORKING_BODY("CF")+query->lastError().text()); } }else{ QMessageBox::warning(this,data.ERRORS.DATABASE_NOT_CONNECTED_TITLE("CF"),data.ERRORS.DATABASE_NOT_CONNECTED_BODY("CF")+db.lastError().text()); } } QSqlDatabase::removeDatabase("qt_sql_default_connection"); // removing database
If I put the message box inside the query, then while the messagebox is open then the table is filled , as soon as I close the messagebox then data vanish but the rows with empty data remains there WHY?
QString command = "select * from countryDetails;"; { QSqlDatabase db = QSqlDatabase::addDatabase("QMYSQL"); db.setDatabaseName(databaseName); db.setPort(databasePort); db.setHostName(databaseHostname); db.setUserName(databaseUsername); db.setPassword(databasePassword); db.open(); if(db.open()){ QSqlQueryModel *model = new QSqlQueryModel(); QSqlQuery *query = new QSqlQuery(db); query->prepare(command); if(query->exec()){ model->setQuery(*query); ui->information->setModel(model); QMessageBox::information(this,"Now it is seen", "seen now"); //setting the model }else{ QMessageBox::warning(this,data.ERRORS.DATABASE_SELECT_NOT_WORKING_TITLE("CF"),data.ERRORS.DATABASE_SELECT_NOT_WORKING_BODY("CF")+query->lastError().text()); } }else{ QMessageBox::warning(this,data.ERRORS.DATABASE_NOT_CONNECTED_TITLE("CF"),data.ERRORS.DATABASE_NOT_CONNECTED_BODY("CF")+db.lastError().text()); } } QSqlDatabase::removeDatabase("qt_sql_default_connection"); // removing database
-
wrote on 28 May 2021, 06:23 last edited by
Do not remove the database. That’s the problem
-
@Thank-You said in using model to fill tableView with QMYSQL:
QSqlQuery *query = new QSqlQuery(db);
And don't create it on the heap - otherwise the query is leaking.
-
QString command = "select * from countryDetails;"; { QSqlDatabase db = QSqlDatabase::addDatabase("QMYSQL"); db.setDatabaseName(databaseName); db.setPort(databasePort); db.setHostName(databaseHostname); db.setUserName(databaseUsername); db.setPassword(databasePassword); db.open(); if(db.open()){ QSqlQueryModel *model = new QSqlQueryModel(); QSqlQuery *query = new QSqlQuery(db); query->prepare(command); if(query->exec()){ model->setQuery(*query); ui->information->setModel(model); //setting the model }else{ QMessageBox::warning(this,data.ERRORS.DATABASE_SELECT_NOT_WORKING_TITLE("CF"),data.ERRORS.DATABASE_SELECT_NOT_WORKING_BODY("CF")+query->lastError().text()); } }else{ QMessageBox::warning(this,data.ERRORS.DATABASE_NOT_CONNECTED_TITLE("CF"),data.ERRORS.DATABASE_NOT_CONNECTED_BODY("CF")+db.lastError().text()); } } QSqlDatabase::removeDatabase("qt_sql_default_connection"); // removing database
If I put the message box inside the query, then while the messagebox is open then the table is filled , as soon as I close the messagebox then data vanish but the rows with empty data remains there WHY?
QString command = "select * from countryDetails;"; { QSqlDatabase db = QSqlDatabase::addDatabase("QMYSQL"); db.setDatabaseName(databaseName); db.setPort(databasePort); db.setHostName(databaseHostname); db.setUserName(databaseUsername); db.setPassword(databasePassword); db.open(); if(db.open()){ QSqlQueryModel *model = new QSqlQueryModel(); QSqlQuery *query = new QSqlQuery(db); query->prepare(command); if(query->exec()){ model->setQuery(*query); ui->information->setModel(model); QMessageBox::information(this,"Now it is seen", "seen now"); //setting the model }else{ QMessageBox::warning(this,data.ERRORS.DATABASE_SELECT_NOT_WORKING_TITLE("CF"),data.ERRORS.DATABASE_SELECT_NOT_WORKING_BODY("CF")+query->lastError().text()); } }else{ QMessageBox::warning(this,data.ERRORS.DATABASE_NOT_CONNECTED_TITLE("CF"),data.ERRORS.DATABASE_NOT_CONNECTED_BODY("CF")+db.lastError().text()); } } QSqlDatabase::removeDatabase("qt_sql_default_connection"); // removing database
wrote on 28 May 2021, 07:06 last edited by JonB@Thank-You said in using model to fill tableView with QMYSQL:
db.open(); if(db.open()){
And don't do that, it makes no sense, if you understand what you are doing.
-
@Thank-You said in using model to fill tableView with QMYSQL:
db.open(); if(db.open()){
And don't do that, it makes no sense, if you understand what you are doing.
-
@Thank-You said in using model to fill tableView with QMYSQL:
QSqlQuery *query = new QSqlQuery(db);
And don't create it on the heap - otherwise the query is leaking.
wrote on 28 May 2021, 07:14 last edited byQSqlQueryModel *model = new QSqlQueryModel(); QSqlQuery query(db); query.prepare(command); if(query.exec()){ model->setQuery(query); ui->report->setModel(model); }
This one doesn't work either
How can I solve it?
-
@Thank-You said in using model to fill tableView with QMYSQL:
How can I solve it?
Did you read @VRonin 's message?
-
wrote on 28 May 2021, 07:17 last edited by
But why the same thing is working with
SQLITE
and not with
MYSQL -
wrote on 28 May 2021, 07:21 last edited by
@Thank-You
Who knows, they are different databases with different driver code & behaviour.Why do you remove the database? What behaviour do you expect after the remove? Why do you care if the behaviour is different between SQLite versus MySQL if the code is wrong and can be corrected?
-
@Thank-You said in using model to fill tableView with QMYSQL:
How can I solve it?
Did you read @VRonin 's message?
wrote on 28 May 2021, 07:21 last edited by Thank You@Christian-Ehrlicher
Yes it worksQSqlDatabasePrivate::addDatabase: duplicate connection name 'report', old connection removed.
But this is error is very very disgusting. Like we should remove the connection,
Can you say another answer or different way??@JonB Because I read somewhere that removing database is always great
https://doc.qt.io/qt-5/qsqldatabase.html#removeDatabase -
@Christian-Ehrlicher
Yes it worksQSqlDatabasePrivate::addDatabase: duplicate connection name 'report', old connection removed.
But this is error is very very disgusting. Like we should remove the connection,
Can you say another answer or different way??@JonB Because I read somewhere that removing database is always great
https://doc.qt.io/qt-5/qsqldatabase.html#removeDatabasewrote on 28 May 2021, 07:30 last edited by@Thank-You
But you have an ongoingui->information->setModel(model)
which is still using the database, and you wonder why it goes wrong after you have done aremoveDatabase()
? Where does it say that situation is a good idea? -
@Christian-Ehrlicher
Yes it worksQSqlDatabasePrivate::addDatabase: duplicate connection name 'report', old connection removed.
But this is error is very very disgusting. Like we should remove the connection,
Can you say another answer or different way??@JonB Because I read somewhere that removing database is always great
https://doc.qt.io/qt-5/qsqldatabase.html#removeDatabase@Thank-You said in using model to fill tableView with QMYSQL:
QSqlDatabasePrivate::addDatabase: duplicate connection name 'report', old connection removed.
Simply add the database once...
-
@Thank-You said in using model to fill tableView with QMYSQL:
QSqlDatabasePrivate::addDatabase: duplicate connection name 'report', old connection removed.
Simply add the database once...
wrote on 28 May 2021, 07:36 last edited by@jsulm
https://doc.qt.io/qt-5/qsqldatabase.html#removeDatabase
Warning: There should be no open queries on the database connection when this function is called, otherwise a resource leak will occur.{ 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
From the official documentation I found that queries should not be open.
I don't know wether I am understanding what you are saying or not. If you mean different thing, please describe in simpler words -
@jsulm
https://doc.qt.io/qt-5/qsqldatabase.html#removeDatabase
Warning: There should be no open queries on the database connection when this function is called, otherwise a resource leak will occur.{ 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
From the official documentation I found that queries should not be open.
I don't know wether I am understanding what you are saying or not. If you mean different thing, please describe in simpler words@Thank-You I was talking about ADDING database.
"QSqlDatabasePrivate::addDatabase: duplicate connection name 'report', old connection removed." - this means you're trying to add a connection which already was added...What you posted now shows again that you still are removing the database though you was told several times already to not to do so. Why?!
-
@jsulm
https://doc.qt.io/qt-5/qsqldatabase.html#removeDatabase
Warning: There should be no open queries on the database connection when this function is called, otherwise a resource leak will occur.{ 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
From the official documentation I found that queries should not be open.
I don't know wether I am understanding what you are saying or not. If you mean different thing, please describe in simpler wordswrote on 28 May 2021, 07:41 last edited by JonB@Thank-You said in using model to fill tableView with QMYSQL:
From the official documentation I found that queries should not be open.
Again: in your case the query is not out of scope/destroyed because you have:
QSqlQueryModel *model = new QSqlQueryModel(); QSqlQuery *query = new QSqlQuery(db); model->setQuery(*query); ui->information->setModel(model)
-
@Thank-You I was talking about ADDING database.
"QSqlDatabasePrivate::addDatabase: duplicate connection name 'report', old connection removed." - this means you're trying to add a connection which already was added...What you posted now shows again that you still are removing the database though you was told several times already to not to do so. Why?!
wrote on 28 May 2021, 07:48 last edited by Thank You@jsulm
If I am right ,
We get this error when we didn't close the database properly.Please see my code at very top ,
There I created database and after executing it
I just removed the databaseYes as said by @Christian-Ehrlicher and @VRonin If I remove this line it actually works but this error is obtained.
Again I will tell you ,
It was working fine when I used the "SQLITE" database, The same code. Even there is no fault in query too.
What is difference between using these database, Is it due to ASYNCHRONUS thing?
Am I right ?? -
@jsulm
If I am right ,
We get this error when we didn't close the database properly.Please see my code at very top ,
There I created database and after executing it
I just removed the databaseYes as said by @Christian-Ehrlicher and @VRonin If I remove this line it actually works but this error is obtained.
Again I will tell you ,
It was working fine when I used the "SQLITE" database, The same code. Even there is no fault in query too.
What is difference between using these database, Is it due to ASYNCHRONUS thing?
Am I right ??wrote on 28 May 2021, 07:57 last edited by@Thank-You
We have tried to tell you. And one more time: just because bad code might work with SQLite but behave differently with MySQL does not mean we can tell you why you might get away with it in some circumstances.Why don't you just think about what you are doing? If you add database, open a query onto it and then set a permanent model to that which is referenced by an outside-world
QTableView
, and then you remove the database while that is still the case, what do you actually expect to happen? Can you not see this might be a problem?- Don't remove the database while you have a view/model using it.
- Don't re-add the same database while you have previously added it and not yet removed it.
Frankly I don't understand your whole architecture of opening a database while you are displaying a message box, and leaving it to persist into the outside world. The usual approach is to open a database initially/first time wanted and persist it till you are ready to close it and never want it again. I wouldn't be adding/removing the same database repeatedly.
1/31