本文主要讲述QT使用ODBC连接MySQL数据库的过程。

第一步,下载连接工具

链接如下:https://cdn.mysql.com//Downloads/Connector-ODBC/8.0/mysql-connector-odbc-8.0.28-winx64.msi

odbc 设置mysql字符集 odbc添加mysql_mysql

下完完成后默认安装即可,安装完成后在电脑的管理工具下可以找到

odbc 设置mysql字符集 odbc添加mysql_odbc 设置mysql字符集_02

打开后如下所示,新安装的没有名称为2和3的两条记录。按照箭头所示,点击添加。

odbc 设置mysql字符集 odbc添加mysql_#include_03

点击添加后如下所示,选择箭头所示,然后点击完成。

odbc 设置mysql字符集 odbc添加mysql_#include_04

点击完成后,如下所示

odbc 设置mysql字符集 odbc添加mysql_#include_05

需要依次填写,其中Data Source Name在使用QT连接ODBC时会用到,此处我写了3,自己取个名字即可。对于Description没有要求,随便写个默认的描述就行。最下面的Database要选择你自己电脑中的数据库,比如我的数据库式binshop,我就选择binshop,选择数据库后点击旁边的Test,可以测试时候连接成功。

本文测试用到的sql文件一并放在下载连接里面,需要的可以直接下载。完成后如下所示。多了一条名称为3的描述

odbc 设置mysql字符集 odbc添加mysql_odbc 设置mysql字符集_06

本文的数据库表描述如下

odbc 设置mysql字符集 odbc添加mysql_mysql_07

QT的代码结构如下:

odbc 设置mysql字符集 odbc添加mysql_#include_08

在untitled.pro里面添加如下代码,相比于原来只添加了sql三个字母,其它全部默认。

QT       += core gui sql

widget.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

widget.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 commodity");
    while(result.next())
    {
        qDebug()<<"user_id:"<<result.value("ID").toInt();
        qDebug()<<"name:"<<result.value("name").toString();
        qDebug()<<"password:"<<result.value("type").toString();
        qDebug()<<"score:"<<result.value("price").toInt()<<endl;
    }
    // 将数据库的内容显示到tableview控件中
    static QSqlQueryModel *mode= new QSqlQueryModel(ui->tableView);
    mode->setQuery("select * from commodity");
    mode->setHeaderData(0,Qt::Horizontal,tr("ID"));
    mode->setHeaderData(1, Qt::Horizontal, tr("name"));
    mode->setHeaderData(2,Qt::Horizontal,tr("type"));
    mode->setHeaderData(3, Qt::Horizontal, tr("price"));
    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连接时自己设置的名字(data source name)
    db.setDatabaseName("3");
    db.setUserName("root");
    db.setPassword("123456");
    bool ok = db.open();
    // 判断数据库是否连接成功
    if (ok){
        // QMessageBox::information(this, "infor", "success");
    }
    else {
        // QMessageBox::information(this, "infor", "open failed");
        qDebug()<<"error open database because"<<db.lastError().text();
    }
    //db.exec("insert commodity values('005','显卡','RTX3090',9500)");
    // 指定条件查询
    QSqlQuery query("SELECT * FROM `commodity` where price > 8000",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.cpp如下

#include "widget.h"

#include <QApplication>

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    Widget w;
    w.show();
    return a.exec();
}

UI文件如下

odbc 设置mysql字符集 odbc添加mysql_数据库_09

只增加了一个按钮和一个tableview。

,程序运行的结果如下

odbc 设置mysql字符集 odbc添加mysql_数据库_10