首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >当连接到数据库时,我会得到一个错误“驱动程序而不是loaded`”

当连接到数据库时,我会得到一个错误“驱动程序而不是loaded`”
EN

Stack Overflow用户
提问于 2014-08-29 23:14:17
回答 3查看 2.2K关注 0票数 1

First: --我正在使用Qt v5.3.1MinGW 4.8.2,以及Window 7 32bit平台。

windows 7中运行我的应用程序时,我发现只有在安装了Qt环境时,它才能正常工作到数据库;当将同一个应用程序移动到另一个平台(如windows xp by Virtual PC )时,不幸的是,我发现到数据库的连接也失败了,出现了错误消息driver not loaded,但是应用程序可以正常工作,但没有连接到数据库。

My的尝试:

  • 我使用QSqlDatabase::drivers()来检查系统中是否支持sqlite,结果是,sqlite数据库支持许多其他类型。
  • 我使用isValid()检查是否有有效的驱动程序,但是函数返回false,这表明数据库类型不可用或无法加载。

下面是我使用的代码:

数据库h

代码语言:javascript
复制
class database
{
public:
    static QSqlDatabase db;
    static QString dbPath;
    database();

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

database.cpp

代码语言:javascript
复制
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);
}

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

代码语言:javascript
复制
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");
    }

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

如何解决这个问题?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2014-09-05 17:46:03

代码语言:javascript
复制
QSqlDatabase database::db = QSqlDatabase::addDatabase("QSQLITE");

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

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

更好的解决方案:停止使用全局变量;您可以在main中打开您的DB连接,并将连接句柄传递给需要它的类(还请注意,QtSql类本机支持“连接名称”的概念,因此您可以从任何地方访问该连接,给定对点的正确名称)。

票数 2
EN

Stack Overflow用户

发布于 2014-08-30 09:14:04

在Windows中,正常用户不能写入\Program Files。( Windows 7中也是如此,但取决于配置,某些路径可能被重定向。)

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

票数 0
EN

Stack Overflow用户

发布于 2014-08-30 20:16:41

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

这句话是假的。您给出的路径相对于当前的工作目录,而不是到可执行文件的位置。如果工作目录和可执行文件的路径恰好相同,那么您只会遇到一个无法依赖的巧合。没关系,可执行文件的位置是不可写的,所以没有必要在那里存储任何变量数据!

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/25577399

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档