首先:我正在使用Qt v5.3.1
MinGW 4.8.2
和Window 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");
}
我不知道与数据库连接有什么问题,一切正常,我的应用程序中没有丢失的文件,以及可执行文件旁边的数据库文件。
如何解决这个问题?
答案 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
类本身支持"连接名称"的概念,所以你可以从任何地方访问该连接,给定正确的连接名称。)