部署时Qt sqlite问题:未加载驱动程序

时间:2017-09-12 15:41:46

标签: c++ windows qt sqlite

正如标题所说,我已经有好几天了。我的程序在QtCreator的调试模式下运行良好,但是一旦我选择了发布模式,我就得到sql驱动程序没有加载的问题(我只在Windows 10上运行它)。我相信我的.pro文件写得正确(QT + = sql写的)。

我尝试过大多数事情:

  • windeployqt.exe。
  • 自己将插件移动到sqldrivers子文件夹中的可执行文件夹中,该文件夹包含Qt安装路径提供的所有sqldrivers,并且还移动到可执行文件夹Qt5Sql.dll
  • 我也尝试过使用sqlite网站提供的sqlite3.dll并在两个(逐个测试的)可执行文件夹和sqldrivers子文件夹中移动它。

正如我所说,问题只发生在部署中,所以我想知道是否应该添加到我的.pro文件中。 我的Windows操作系统上没有安装任何sql程序。如果这是我认为的问题,我想知道如何强制我的程序使用sqldrivers子文件夹中提供的插件。

错误:

QSqlDatabase: QSQLITE driver not loaded
QSqlDatabase: available drivers: 
QSqlDatabase: an instance of QCoreApplication is required for loading driver plugins
QSqlQuery::exec: database not open
编辑:我设法解决了这个问题。问题来自我没想到的事情。我正在使用全局变量,其中一个是我的数据库,我通过再次读取错误来实现它,因为它似乎是在main.cpp的第一行(在#include之前)加载数据库。所以现在我每次使用它时都会使用打开和关闭数据库。有什么方法可以声明一个全局数据库(让它一直保持打开状态)?我正在非常密集地使用它。

1 个答案:

答案 0 :(得分:0)

是的,您可以打开数据库一次,然后只使用QSqlDatabase类的静态公共方法:

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();
} 

然后在另一个地方:

QSqlDatabase db = QSqlDatabase::database();

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

请参阅QSqlDatabase::addDatabase(),并根据需要使用参数connectionName