当连接到数据库时,我收到错误`driver not loaded`

时间:2014-08-29 23:14:17

标签: c++ qt sqlite database-connection qt5

首先:我正在使用Qt v5.3.1 MinGW 4.8.2Window 7 32bit平台。

windows 7中运行我的应用程序时,我发现只有安装了Qt环境才能正常连接数据库,同时将windows xp移动到同一个应用程序Virtual PC不幸的是,我发现与数据库的连接也失败了,并显示一条错误消息driver not loaded,但应用程序工作正常但没有连接到数据库。

我的尝试:

  • 我使用QSqlDatabase::drivers()检查是否支持sqlite 在系统中,结果是,sqlite数据库 支持许多其他类型。

  • 我使用isValid()检查是否有有效的驱动程序,但是 函数返回false,这表示数据库类型是 无法使用或无法加载。

以下是我使用的代码:

database.h

class database
{
public:
    static QSqlDatabase db;
    static QString dbPath;
    database();

    static void connect();
    static bool openConnection();
    static void CloseConnection();
    static void removeDB();
};

database.cpp

QSqlDatabase database::db = QSqlDatabase::addDatabase("QSQLITE");
QString database::dbPath = "";

database::database(){
}

void database::connect(){
    database::dbPath = "database.db";
    database::db.setDatabaseName(database::dbPath);
}

void database::CloseConnection(){
    database::db.close();
}

void database::removeDB(){
    database::db.removeDatabase(database::db.defaultConnection);
}

此外,我已检查数据库文件是否存在,并且我已打开与数据库的连接。

database::connect();
  if(QFile::exists(database::dbPath)){
      if(database::db.open()){
          ui->label->setText(ui->label->text() + "Connected.");
          QSqlQuery qry;
          qry.prepare("SELECT * FROM users");
          qry.exec();
          while(qry.next()){
              ui->listWidget->addItem(qry.value("username").toString());
              ui->listWidget->item(ui->listWidget->count()-1)->setData(Qt::UserRole, qry.value("id").toString());
            }
          database::CloseConnection();
        }else{
          ui->label->setText(ui->label->text() + "Failed to connect to database");
        }
    }else{
      ui->label->setText(ui->label->text() + "Database file does not found");
    }

我不知道与数据库连接有什么问题,一切正常,我的应用程序中没有丢失的文件,以及可执行文件旁边的数据库文件。

如何解决这个问题?

3 个答案:

答案 0 :(得分:0)

在Windows XP中,普通用户无法写入\Program Files。 (它也不是在Windows 7中,但根据配置,某些路径可能会被重定向。)

使用QDesktopServices::DataLocation(Qt 4)或QStandardPaths::DataLocation(Qt 5)。

答案 1 :(得分:0)

  

database::dbPath = "database.db"表示可执行文件旁边或应用程序主目录中的数据库文件"

这句话是错误的。您提供的路径是相对于当前工作目录,到可执行文件的位置。如果工作目录和可执行文件的路径恰好相同,那么您只会遇到一个不能依赖的巧合。别担心可执行文件的位置不可写,所以在那里存储任何变量数据都没有意义!

您需要将该数据库存储在其他位置,并且您必须明确其存储位置。

答案 2 :(得分:0)

QSqlDatabase database::db = QSqlDatabase::addDatabase("QSQLITE");

这一行是问题所在。这是全局代码(在main之前运行的代码),后者又在创建QCoreApplication实例之前尝试加载Qt插件。因此,此呼叫将失败。

解决方案:保留默认初始化状态,并在创建addDatabase后调用QCoreApplication

更好的解决方案停止使用全局变量;您可以在main中打开数据库连接,并将连接句柄传递给需要它的类(还要注意QtSql类本身支持"连接名称"的概念,所以你可以从任何地方访问该连接,给定正确的连接名称。)