PDA

View Full Version : Disconnecting from database after using QSqlTableModel



RobbieClarken
7th April 2009, 13:38
Hi,

I'm trying to create a GUI which has three buttons:

connectButton: Connects to a SQLite3 database file on my computer.
showTableButton: Shows a table from the database file in a QTableView.
disconnectButton: Disconnects from the database file so I can edit it externally without closing the QT GUI.

The code for each button is:

on_connectButton_clicked():

QSqlDatabase db = QSqlDatabase::addDatabase("QSQLITE", "metadataDB");
db.setDatabaseName("metadata.db");

on_showTableButton_clicked():

QSqlDatabase db = QSqlDatabase::database("metadataDB");
QSqlTableModel *model = new QSqlTableModel(this,db);
model->setEditStrategy(QSqlTableModel::OnManualSubmit);
model->setTable("TableName");
model->select();
QTableView *view = new QTableView;
view->setModel(model);
view->show();

on_disconnectButton_clicked()

QSqlDatabase db = QSqlDatabase::database("metadataDB");
db.close();
QSqlDatabase::removeDatabase("metadataDB");

The program connects to the database and displays the table correctly. However disconnectButton() doesn't release the metadata.db file. So if I try and delete or rename the file I get "the process cannot access the file because it is being used by another process". If I close the QT GUI then metadata.db is accessible again. Similarly if I never call showTableButton then metadata.db is always accessible.

If anyone could point out what I'm doing wrong I would greatly appreciate it. I suspect I need to delete the QTableModel but I'm not sure how to get a handle for it from inside disconnectButton().

Regards,

Robbie

spirit
7th April 2009, 13:44
did you try to do something like this?


QSqlDatabase db = QSqlDatabase::database("metadataDB");
db.close();
QSqlDatabase::removeDatabase("metadataDB");
db = QSqlDatabase();

RobbieClarken
7th April 2009, 14:05
did you try to do something like this?


QSqlDatabase db = QSqlDatabase::database("metadataDB");
db.close();
QSqlDatabase::removeDatabase("metadataDB");
db = QSqlDatabase();


Hi spirit,

Thanks for the suggestion. Alas that doesn't work. Neither does redefining db.setDatabaseName(). I do suspect it will be something simple like that!

mazurekwrc
7th April 2009, 15:55
I don't look to your file only to this code on page, have you use somewhere


db.open()

RobbieClarken
8th April 2009, 03:41
I don't look to your file only to this code on page, have you use somewhere


db.open()


You're right that I did forget that line. Unfortunately inserting it doesn't resolve my problem. :(

spirit
8th April 2009, 06:59
You're right that I did forget that line. Unfortunately inserting it doesn't resolve my problem. :(

that's not an error, because you use QSqlDatabase::database and this method automatically opens database, from docs.


QSqlDatabase QSqlDatabase::database ( const QString & connectionName = QLatin1String( defaultConnection ), bool open = true ) [static]

mazurekwrc
8th April 2009, 10:51
maybe try in on_disconnectButton_clicked first delete model and after that close and remove database