驱动成功加载,但还是提示Failed to connect to database: “Driver not loaded Driver not loaded“

问题描述:

在这里插入图片描述

QT中使用mysql进行数据库操作,在一个cpp中成功连接到mysql数据库并创建了新的数据库,但是在另一个cpp中使用setDatabaseName(“数据库名”)并open,会弹出警告Failed to connect to database: “Driver not loaded Driver not loaded”。具体如下:

1.cpp  连接并创建数据库 
void PersonPro::init()
{
    //创建数据库连接
    QSqlDatabase db;
    db = QSqlDatabase::addDatabase("QMYSQL");
    db.setPort(3306);
    db.setUserName("root");
    db.setPassword("root");
    db.setHostName("localhost");

    //打开数据库连接
    if(!db.open())
    {
        qDebug()<<"Failed to connect to database:"<<db.lastError().text();
    }

    //创建新的数据库
    QSqlQuery query (db);
    query.exec("CREATE DATABASE IF NOT EXISTS person");
}

上述代码运行无问题,Navicat中会显示成功创建的数据库person。注意,addDatabase()函数第二个参数是数据库的连接名称,(最好写成db = QSqlDatabase::addDatabase("QMYSQL","connectName");)如果不写明具体名称,会使用默认连接"default",通过调用QSqlDatabase::database()函数获取数据库连接时,默认会返回名为"default"的连接。如果只需要一个数据库连接或者希望使用默认连接进行所有的数据库操作不指定具体的连接名称是可以的。但如果需要多个连接或区分不同的连接对象,最好为每个连接指定一个独特的连接名称,否则极易出错。
在这里插入图片描述
数据库连接名(Connection Name):localhost_mysql_3306
数据库名(Database Name):databasemanage、 information_schema、mysql、performance_schema、person
数据表名(Table Name):person的【表】中被折叠部分,这里没有显示出来。
可以理解为你去办公室找班主任(Connection Name成功连接),向他汇报作业情况、要成绩单等(选择某个数据库Database Name),从各科成绩单中选中了数学成绩单(选择数据表),查询了你的成绩(数据查询),但你没有发现你的名字(查询失败),询问后才知道,你在另一张成绩单上面(另一个数据表),成绩并不理想Q.Q,然后突然发现某题分数算错了,和班主任说明情况后更改了成绩(数据更新),成绩达到要求了,你可以把你的大名从这张成绩单中删除(数据删除),写在之前的成绩单中了(数据创建),很好,你不用回家挨打了!!!

2.cpp 使用新创建的数据库person,创建一个新的数据表requirment
void PersonHabit::init()
{
    //选择新的数据库
    db.setDatabaseName("person");
    if(!db.open())
    {
        qDebug()<<"Failed to connect to database:"<<db.lastError().text();
    }

    //创建新的表
    query.exec("CREATE TABLE IF NOT EXISTS person.requirment(\
               Name VARCHAR(25),\
               Requment VARCHAR(25),\
               Expect VARCHAR(25),\
               Date VARCHAR(25),\
               Sucess VARCHAR(25),\
               Other VARCHAR(255))");

    db.close();

}

能够成功编译,但是会在【应用程序输出】弹出错误提示Failed to connect to database: “Driver not loaded Driver not loaded”。

解决方法:

由于代码中未指定连接名(connect Name),所以在2.cppdb.setDatabaseName("person");前面加上db = QSqlDatabase::database();错误就解决了。如果去除【选择新的数据库】的代码,那么在query.exec();前加上query = QSqlQuery::QSqlQuery(“数据库名”);也是可以的。

2.cpp 使用新创建的数据库person,创建一个新的数据表requirment
void PersonHabit::init()
{
    //选择新的数据库
    db = QSqlDatabase::database();
    db.setDatabaseName("person");
    if(!db.open())
    {
        qDebug()<<"Failed to connect to database:"<<db.lastError().text();
    }
    //创建新的表
    query.exec("CREATE TABLE IF NOT EXISTS person.requirment(\
               Name VARCHAR(25),\
               Requment VARCHAR(25),\
               Expect VARCHAR(25),\
               Date VARCHAR(25),\
               Sucess VARCHAR(25),\
               Other VARCHAR(255))");
    db.close();
}

3.cpp 直接创建一个新的数据库表
void PersonHabit::init()
{
    //创建新的表
    query = QSqlQuery::QSqlQuery("数据库名");
    query.exec("CREATE TABLE IF NOT EXISTS person.requirment(\
               Name VARCHAR(25),\
               Requment VARCHAR(25),\
               Expect VARCHAR(25),\
               Date VARCHAR(25),\
               Sucess VARCHAR(25),\
               Other VARCHAR(255))");
    db.close();
}

后续给出指定连接名和不指定连接名两种方式的代码,并将两部分放一起。

不指明具体连接名:

void PersonPro::init()
{
    //创建数据库连接
    QSqlDatabase db;
    db = QSqlDatabase::addDatabase("QMYSQL");
    db.setPort(3306);
    db.setUserName("root");
    db.setPassword("root");
    db.setHostName("localhost");

    //打开数据库连接
    if(!db.open())
    {
        qDebug()<<"Failed to connect to database:"<<db.lastError().text();
    }

    //创建新的数据库
    QSqlQuery query (db);
    query.exec("CREATE DATABASE IF NOT EXISTS person");
    
    
    //选择新的数据库
    QSqlDatabase db;
    db = QSqlDatabase::database();
    //两部分代码合并上面两行可以去掉
    db.setDatabaseName("person");
    if(!db.open())
    {
        qDebug()<<"Failed to connect to database:"<<db.lastError().text();
    }

    //创建新的表
    query = QSqlQuery::QSqlQuery(db);
    //两部分代码合并上面一行可以去掉
    query.exec("CREATE TABLE IF NOT EXISTS person.requirment(\
               Name VARCHAR(25),\
               Requment VARCHAR(25),\
               Expect VARCHAR(25),\
               Date VARCHAR(25),\
               Sucess VARCHAR(25),\
               Other VARCHAR(255))");

    db.close();

}

指明具体连接名

void PersonPro::init()
{
    //创建数据库连接
    QSqlDatabase db;
    db = QSqlDatabase::addDatabase("QMYSQL","connectName");
    db.setPort(3306);
    db.setUserName("root");
    db.setPassword("root");
    db.setHostName("localhost");

    //打开数据库连接
    if(!db.open())
    {
        qDebug()<<"Failed to connect to database:"<<db.lastError().text();
    }

    //创建新的数据库
    QSqlQuery query (db);
    query.exec("CREATE DATABASE IF NOT EXISTS person");
    
    
    //选择新的数据库
    QSqlDatabase db;
    db = QSqlDatabase::database("connectName");
    //两部分代码合并上面两行可以去掉
    db.setDatabaseName("person");
    if(!db.open())
    {
        qDebug()<<"Failed to connect to database:"<<db.lastError().text();
    }

    //创建新的表
    query = QSqlQuery::QSqlQuery(db);
    //两部分代码合并上面一行可以去掉
    query.exec("CREATE TABLE IF NOT EXISTS person.requirment(\
               Name VARCHAR(25),\
               Requment VARCHAR(25),\
               Expect VARCHAR(25),\
               Date VARCHAR(25),\
               Sucess VARCHAR(25),\
               Other VARCHAR(255))");

    db.close();
如果Qt数据库驱动程序成功加载但仍提示"Failed to connect to database: Driver not loaded"错误,可能是由于以下原因之一: 1. 缺少数据库驱动插件:确保已正确安装了所需的数据库驱动插件。对于SQLite数据库,通常需要安装`libqsqlite.so`(Linux)或`qsqlite.dll`(Windows)等插件文件。你可以在Qt安装目录的`plugins/sqldrivers/`目录下找到这些插件文件。 2. 驱动插件未正确加载:确保在应用程序代码中正确加载数据库驱动插件。你可以在打开数据库连接之前,调用`QSqlDatabase::addDatabase()`函数和`QSqlDatabase::registerSqlDriver()`函数来加载和注册数据库驱动插件。 以下是一个示例代码片段,演示如何在Qt加载和注册SQLite数据库驱动插件: ```cpp #include <QSqlDatabase> #include <QSqlQuery> #include <QDebug> int main() { // 加载SQLite数据库驱动插件 QSqlDatabase::addDatabase("QSQLITE"); // 注册SQLite数据库驱动 QSqlDatabase::registerSqlDriver("QSQLITE"); QSqlDatabase db = QSqlDatabase::database(); db.setDatabaseName("qdata.db"); if (!db.open()) { qDebug() << "无法打开数据库:" << db.lastError().text(); return -1; } // 数据库成功打开,可以执行其他操作 db.close(); return 0; } ``` 请注意,这里的示例代码没有指定具体的数据库连接名称,因此使用默认连接。如果你在代码中使用了其他连接名称,请相应地进行修改。 希望这些信息能对你有所帮助。如果问题仍然存在,请提供更多的细节和错误消息,以便我能更好地帮助你解决问题。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

冰封的雪绒

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值