QT通过ODBC连接MySQL数据库

911 阅读2分钟

本文已参与「新人创作礼」活动,一起开启掘金创作之路。

第一步下载ODBC,官网的下载链接如下https://cdn.mysql.com//Downloads/Connector-ODBC/8.0/mysql-connector-odbc-8.0.28-winx64.msi

下载完成后得到的文件如下所示

1.PNG

然后直接全部默认安装即可。

安装完成后,在电脑的Windows管理工具下面,可以找到一个ODBC数据源(64位)的程序,如下所示。

2.png

初次打开会有几个默认的数据源,不用管,界面如下所示

3.PNG

因为我们需要连接MySQL数据库,所以我们先进入MySQL查看一下现在拥有哪些数据库,如下所示,下面我们将以qtdatabase数据库为例进行说明。

4.PNG

数据库的内容信息如下所示。

5.PNG

下面我们首先使用ODBC连接数据库,其步骤如下所示。首先在下面的界面中点击添加按钮

6.PNG

按照上面的步骤完成后,后面的操作如下,在下面的图例中选择Mysql ODBC 8.0 ANSI Driver

7.PNG 按照上述描述选择完成之后,下一步就是填写验证信息,包括用户名、密码等,如下所示,Data source Name非常重要,在QT连接数据库时用得到这个名字。下面的按照需要填写就可以,最后一项Database是在下拉菜单中选择,系统中所有的数据库之一。然后点击test,如果出现右边成功的提示,就说明数据库连接成功。

8.PNG

上述操作完成后,就会看到下面一条信息,在刚刚进入ODBC的主界面中。

9.PNG 这就说明配置成功了。接下来就是如何写QT的代码了。

先看一下项目结构

10.PNG

然后在.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文件

11.PNG

下面是运行的截图

12.PNG 其查询的结果与数据库的内容一致,说明查询没有问题,连接成功。