本文已参与「新人创作礼」活动,一起开启掘金创作之路。
第一步下载ODBC,官网的下载链接如下https://cdn.mysql.com//Downloads/Connector-ODBC/8.0/mysql-connector-odbc-8.0.28-winx64.msi
下载完成后得到的文件如下所示
然后直接全部默认安装即可。
安装完成后,在电脑的Windows管理工具下面,可以找到一个ODBC数据源(64位)的程序,如下所示。
初次打开会有几个默认的数据源,不用管,界面如下所示
因为我们需要连接MySQL数据库,所以我们先进入MySQL查看一下现在拥有哪些数据库,如下所示,下面我们将以qtdatabase数据库为例进行说明。
数据库的内容信息如下所示。
下面我们首先使用ODBC连接数据库,其步骤如下所示。首先在下面的界面中点击添加按钮
按照上面的步骤完成后,后面的操作如下,在下面的图例中选择Mysql ODBC 8.0 ANSI Driver
按照上述描述选择完成之后,下一步就是填写验证信息,包括用户名、密码等,如下所示,Data source Name非常重要,在QT连接数据库时用得到这个名字。下面的按照需要填写就可以,最后一项Database是在下拉菜单中选择,系统中所有的数据库之一。然后点击test,如果出现右边成功的提示,就说明数据库连接成功。
上述操作完成后,就会看到下面一条信息,在刚刚进入ODBC的主界面中。
这就说明配置成功了。接下来就是如何写QT的代码了。
先看一下项目结构
然后在.pro里面加入下面一句
QT += sql
然后是.h文件
#ifndef WIDGET_H
#define WIDGET_H
#include <QWidget>
#include <QSqlDatabase>
#include <QSqlQuery>
#include <QDebug>
#include <QStringList>
#include <QMessageBox>
#include <QSqlError>
#include <QSqlDatabase>
#include <QSqlQueryModel>
#include <QSqlRecord>
#include <QString>
QT_BEGIN_NAMESPACE
namespace Ui { class Widget; }
QT_END_NAMESPACE
class Widget : public QWidget
{
Q_OBJECT
public:
Widget(QWidget *parent = nullptr);
~Widget();
void QueryData(QSqlDatabase db);
private slots:
void on_pushButton_clicked();
void on_tableView_doubleClicked(const QModelIndex &index);
private:
Ui::Widget *ui;
};
#endif // WIDGET_H
然后是.cpp
#include "widget.h"
#include "ui_widget.h"
Widget::Widget(QWidget *parent)
: QWidget(parent)
, ui(new Ui::Widget)
{
ui->setupUi(this);
}
Widget::~Widget()
{
delete ui;
}
void Widget::QueryData(QSqlDatabase db)
{
// 查询数据库中所有表的名称
QStringList tables = db.tables();
foreach(QString table, tables)
qDebug()<<table;
// ODBC查询数据
QSqlQuery result = db.exec("select * from student_info");
while(result.next())
{
qDebug()<<"user_id:"<<result.value("ID").toInt();
qDebug()<<"name:"<<result.value("name").toString();
qDebug()<<"password:"<<result.value("age").toString();
qDebug()<<"score:"<<result.value("class_name").toInt()<<endl;
}
// 将数据库的内容显示到tableview控件中
static QSqlQueryModel *mode= new QSqlQueryModel(ui->tableView);
mode->setQuery("select * from student_info");
mode->setHeaderData(0,Qt::Horizontal,tr("ID"));
mode->setHeaderData(1, Qt::Horizontal, tr("name"));
mode->setHeaderData(2,Qt::Horizontal,tr("age"));
mode->setHeaderData(3, Qt::Horizontal, tr("class_name"));
ui->tableView->setModel(mode);
}
// 查询按钮
void Widget::on_pushButton_clicked()
{
// 通过ODBC连接MYSQL数据库
QSqlDatabase db = QSqlDatabase::addDatabase("QODBC");
db.setHostName("127.0.0.1");
db.setPort(3306);
// 使用ODBC连接时自己设置的名字
db.setDatabaseName("1");
db.setUserName("root");
db.setPassword("123456");
bool ok = db.open();
// 判断数据库是否连接成功
if (ok){
}
else {
qDebug()<<"error open database because"<<db.lastError().text();
}
// 指定条件查询
QSqlQuery query("SELECT * FROM `student_info` where class_name = '网络工程'",db);
QSqlRecord rec = query.record();
while(query.next())
{
rec = query.record();
int id = rec.indexOf("ID");
QString ID = query.value(id).toString();
qDebug()<<"ID"<<ID;
int na = rec.indexOf("name");
QString name = query.value(na).toString();
qDebug()<<"name"<<name;
}
QueryData(db);
}
// 给tableview添加双击事件。
void Widget::on_tableView_doubleClicked(const QModelIndex &index)
{
int row=index.row();
int col=index.column();
// qDebug()<<row;
// qDebug()<<col;
QString id = ui->tableView->model()->index(row,col).data().toString();
qDebug()<<id;
}
main函数直接默认即可,最后看一下UI文件
下面是运行的截图
其查询的结果与数据库的内容一致,说明查询没有问题,连接成功。