First: --我正在使用Qt v5.3.1和MinGW 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
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");
}我不知道与数据库连接有什么问题,一切正常,我的应用程序中没有缺少文件,可执行文件旁边的数据库文件也没有丢失。
如何解决这个问题?
发布于 2014-09-05 17:46:03
QSqlDatabase database::db = QSqlDatabase::addDatabase("QSQLITE");这条线就是问题所在。这是全局代码(在main之前运行的代码),然后尝试在创建QCoreApplication实例之前加载Qt插件。因此,这一呼吁将失败。
解决方案:将其保留为默认初始化,并在创建QCoreApplication后调用addDatabase。
更好的解决方案:停止使用全局变量;您可以在main中打开您的DB连接,并将连接句柄传递给需要它的类(还请注意,QtSql类本机支持“连接名称”的概念,因此您可以从任何地方访问该连接,给定对点的正确名称)。
发布于 2014-08-30 09:14:04
在Windows中,正常用户不能写入\Program Files。( Windows 7中也是如此,但取决于配置,某些路径可能被重定向。)
使用QDesktopServices::DataLocation (Qt 4)或QStandardPaths::DataLocation (Qt 5)。
发布于 2014-08-30 20:16:41
database::dbPath = "database.db"是指可执行文件旁边的数据库文件或应用程序主目录中的数据库文件“
这句话是假的。您给出的路径相对于当前的工作目录,而不是到可执行文件的位置。如果工作目录和可执行文件的路径恰好相同,那么您只会遇到一个无法依赖的巧合。没关系,可执行文件的位置是不可写的,所以没有必要在那里存储任何变量数据!
您需要将该数据库存储在其他地方,并且必须明确它的存储位置。
https://stackoverflow.com/questions/25577399
复制相似问题