简体   繁体   中英

Qt sqlite issue at deployement : driver not loaded

As the title says, I've been having this issue for some days now. My program runs fine in debug mode on QtCreator, but once I choose release mode, I get the sql driver not loaded issue (I've only been running it on windows 10). I believe my .pro file is correctly written (QT += sql is written).

I've tried most things I could :

  • windeployqt.exe .
  • move plugins myself in sqldrivers sub-folder in executable folder containing all sqldrivers provided by Qt installation path and also moved at executable folder Qt5Sql.dll
  • I also tried using sqlite3.dll provided by sqlite website and moving it in both (one by one tested) executable folder and sqldrivers sub-folder.

As I said the issue happens only at deployement so I am wondering if there is something I should have added to my .pro file. I don't have any sql program installed on my windows OS. If that is the issue, which I think is, I was wondering how I could force my program to use plugins provided in sqldrivers sub-folder.

Errors :

QSqlDatabase: QSQLITE driver not loaded
QSqlDatabase: available drivers: 
QSqlDatabase: an instance of QCoreApplication is required for loading driver plugins
QSqlQuery::exec: database not open

EDIT : I managed to fix that. The issue came from something I didn't expect. I was using global variables and one of them was my database, I realized it by reading again the error as it seemed the database was loaded before the first lines of main.cpp (at #include). So right now I'm using opening and closing the database each time I use it. Is there some way I could declare a global database (keep it open all the time) ? I'm using it quite intensively.

Yes, you can open your database once and then just use static public methods of the QSqlDatabase class:

QSqlDatabase my_db = QSqlDatabase::addDatabase("QSQLITE");
my_db.setDatabaseName("my_db_name.sqlite");

if(my_db.open())
{
    my_db.exec("create table person (id int primary key, "
        "firstname varchar(20), lastname varchar(20))");
}
else
{
    qDebug() << my_db.lastError().text();
} 

And then in another place:

QSqlDatabase db = QSqlDatabase::database();

if(db.isOpen())
{
    qDebug() << "Wow";
    db.exec("insert into person values(101, 'Danny', 'Young')");        
}

See QSqlDatabase::addDatabase() , and use the parameter connectionName if necessary.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM