[Interest] how to properly close a SQLite database?
Francisco Ares
frares at gmail.com
Wed Jun 25 10:56:18 CEST 2014
Thanks, Constantin.
Do you know if is it possible to have two QSqlDatabase objects (using
SQLite driver, of course), in the same program? I think I will make some
tests with its "clone" function.
Francisco
2014-06-25 0:46 GMT-03:00 Constantin Makshin <cmakshin at gmail.com>:
> QSqlDatabase::close() closes the database backend connection but leaves
> QtSql one intact, i.e. even after close() your QSqlDatabase object
> occupies its slot in the [global] list of existing database objects. So
> in order to let QSqlDatabase::removeDatabase() do its job you have to
> destroy all QSqlDatabase objects referring to that connection.
>
> Here is a fragment from one of my applications:
>
> void Application::closeDatabase ()
> {
> QString connectionName = m_db.connectionName();
>
> m_db.close();
> m_db = QSqlDatabase();
> QSqlDatabase::removeDatabase(connectionName);
> }
>
> On 06/24/2014 09:25 PM, Francisco Ares wrote:
> > Hi,
> >
> > Before of anything else, thanks to anyone reading this message. I'm
> > using Qt 4.8.5 and QtCreator.
> >
> > I use SQLite for data storage in an embedded system, and that is OK.
> > There is a class, named "CDataBase" that holds the "QSqlDatabase" object
> > and all of the "QSqlQuery" objects used on this program, and all access
> > to the database itself is made through member functions of this class,
> > providing a non-SQL interface for the rest of the program. The class has
> > an "init" function to receive the database file name:
> >
> > void CDataBase::init(QString fileName)
> > {
> > mDB = QSqlDatabase::addDatabase("QSQLITE");
> > mDB.setDatabaseName(fileName);
> > mDB.open();
> > ...
> > }
> >
> > Now I need to implement a backup for that data in a removable drive. For
> > that, I have created a second "CDataBase" object to handle the backup
> > data base file. The objects that use "CDataBase" have means implemented
> > to switch from a "CDataBase" object to another one (at least I believe
> > so, as I could not test it).
> >
> > When the program tries open the new object's database connection, the
> > program stops (in debug mode) on the first instruction of the "init"
> > function; hitting F10, a warning shows up on the program output pane:
> >
> > QSqlDatabasePrivate::removeDatabase: connection
> > 'qt_sql_default_connection' is still in use, all queries will cease to
> work.
> >
> > So, I've implemented a "finish()" member function for this class:
> >
> > void CDataBase::finish()
> > {
> > if (mDB.isOpen())
> > {
> > mDB.commit();
> > mDB.close();
> > mDB.removeDatabase(mDB.connectionName());
> > }
> > }
> >
> > So, when I try this:
> >
> > mDataBaseWork->finish();
> >
> >
> > the same warning message shows up on trying to execute the
> > "removeDatabase" instruction.
> >
> > All the QSqlQueries are temporary, they are all dead at this point. I
> > even tried to do:
> >
> > {
> > QSqlQuery query (mDB, query);
> > ...
> > ...
> > query.finish();
> > query.clear();
> > }
> >
> > And it didn't work as well.
> >
> > What am I doing wrong?
> >
> > Thanks again,
> > Francisco
>
>
> _______________________________________________
> Interest mailing list
> Interest at qt-project.org
> http://lists.qt-project.org/mailman/listinfo/interest
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.qt-project.org/pipermail/interest/attachments/20140625/72b0b235/attachment.html>
More information about the Interest
mailing list