问题描述:
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.cpp的db.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();