Frage

I have widget which connects to database:

Widget::Widget(QWidget *parent)
{
    QString databaseName = "name";
    QSqlDatabase db = QSqlDatabase::addDatabase("QSQLITE");
    db.setDatabaseName(databaseName);
    db.setHostName("localhost");
    if(!db.open())
        qDebug()<<"ret error";
}

Now I want to delete database connection after widget close (currently I get warnings like: QSqlDatabasePrivate::removeDatabase: connection 'qt_sql_default_connection is still in use...). I' ve read some topics and tried to evaluate some solution from them but none works for me. My code:

void Widget::closeEvent(QCloseEvent *e)
{
    QSqlDatabase db = QSqlDatabase::database();
    QString connection = db.connectionName();
    db.close();
    QSqlDatabase::removeDatabase(connection);
    qDebug()<<"error: "<<db.lastError().text();
}

Error I get is: Driver not loaded Driver not loaded

What is the correct way to do this?

Edit:

another method:

void Widget::someMethod()
{
    QSqlDatabase db = QSqlDatabase::database();
    QSqlQuery query(db);
    query.exec("some query");
}
War es hilfreich?

Lösung

Try giving a connection name parameter(2nd parameter) in addDatabase() , that should solve your problem.

Here is the modified code you could try:

Widget::Widget(QWidget *parent)
{
    QString databaseName = "name";
    QSqlDatabase db = QSqlDatabase::addDatabase("QSQLITE", "test_db_connection" );
    db.setDatabaseName(databaseName);
    db.setHostName("localhost");
    if(!db.open())
        qDebug()<<"ret error";
}

Here is a complete working code from my machine for sqlite database which you can use as reference:

local_db = QSqlDatabase::addDatabase("QSQLITE","localdb");
local_db.setDatabaseName("localdb.sqlite");
local_db_query = QSqlQuery(local_db);
local_db_query.prepare( "SELECT * FROM sample_table" );
local_db_query.exec();
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top