Qt 连接 MySQL

1 Qt 连接本地 MySQL 的方法 (Win)

1.1 前期准备

1.1.1 MySQL 安装

MySQL的安装

1.1.2 新建试验用的数据库和表

根据需要,自行新建数据库并添加数据

1
2
3
4
create database neuralinfo;
use neuralinfo;
create table users(user_name char(50), user_passwd char(50), primary key(user_name))engine=InnoDB;
insert into users values('info','123456');

image-20210527104152754

1.1.3 ODBC 安装

ODBC安装 参考

image-20210527103810926

  • 打开 ODBC 64

    image-20210527103907632

  • 添加用户 DSN,根据实际情况填写即可

    image-20210527104308974

    image-20210527104415956

1.2 Qt 连接数据库

这里,我们写了一个登录页面来试验 MySQL 的连接

1.2.1 UI

  • 主窗口如图,输入框均为 LineEdit

image-20210527104746481

  • 用户名和口令正确,点击 Login 会进入子窗口,子窗口为空白窗口

    image-20210527105011886

1.2.2 源码逻辑

https://github.com/woopokyuk/qtLogin

pro 文件中需要 QT+=sql

  • 必要头文件

    1
    2
    3
    #include <QSqlDatabase>
    #include <QSqlQuery>
    #include <QDebug>
  • 连接与语句执行方法

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    qDebug() << QSqlDatabase::drivers();
    ui->passwdLineEdit->setEchoMode(QLineEdit::Password);
    QSqlDatabase db = QSqlDatabase::addDatabase("QODBC");
    db.setHostName("127.0.0.1");
    db.setPort(3306);
    db.setDatabaseName("Neural"); // ODBC 中数据源的名称,不是 MySQL 中数据库的名称
    db.setUserName("root");
    db.setPassword("0000"); // 数据库登录密码
    db.open();
    if (!db.open()) {
    qDebug() << "db not open";
    return;
    }

    QString passwd = ui->passwdLineEdit->text();
    QString sqlLine = "SELECT * FROM users WHERE user_passwd=" + passwd;
    QSqlQuery result = db.exec(sqlLine); // 执行 MySQL 语句
    QString userNameInSql = "";
    while (result.next()) {
    userNameInSql = result.value("user_name").toString();
    qDebug() << userNameInSql;
    }
    QString inputUserName = ui->userLineEdit->text();
    if(userNameInSql == inputUserName && inputUserName != "") { // 验证用户名口令是否一致
    test->show();
    }
    else {
    qDebug() << "User name or Password is wrong!";
    }

2 Linux Qt 连接远程 MySQL(Win)


2.1 Linux 下载安装 ODBC

2.1.1 安装 unixODBC 和 ODBC

主要参考 https://blog.csdn.net/seakingx/article/details/87879164

  • 进行到 sudo myodbc-installer -a -d -n "MySQL ODBC 8.0 Driver" -t "Driver=/usr/local/lib/libmyodbc8w.so 时,报错

    1
    myodbc-installer: error while loading shared libraries: libodbc.so.2: cannot open shared object file: No such file or directory

原因:未按步骤安装 unixODBC,按以上参考顺序安装即可,若遇权限问题 sudo 无法解决 (如安装 unixODBC 过程中需要 make 但有权限问题 sudo 无法解决),就 su 转 root 用户再执行指令

  • 正确步骤:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    # unixODBC 安装
    sudo wget ftp://ftp.unixodbc.org/pub/unixODBC/unixODBC-2.3.4.tar.gz
    tar -xvzf unixODBC-2.3.4.tar.gz
    cd unixODBC-2.3.4/
    sudo ./configure --sysconfdir=/etc
    make
    sudo make install

    # 检验是否安装成功
    odbcinst -j

    # odbc 安装
    sudo tar zxvf mysql-connector-odbc-8.0.15-linux-ubuntu18.04-x86-64bit.tar.gz
    cd mysql-connector-odbc-8.0.15-linux-ubuntu18.04-x86-64bit/
    sudo cp bin/* /usr/local/bin
    sudo cp lib/* /usr/local/lib

    sudo myodbc-installer -a -d -n "MySQL ODBC 8.0 Driver" -t "Driver=/usr/local/lib/libmyodbc8w.so"
    sudo myodbc-installer -a -d -n "MySQL ODBC 8.0" -t "Driver=/usr/local/lib/libmyodbc8a.so"

    # 验证是否安装成功
    myodbc-installer -d -l

    # 设置ODBC 参数
    sudo vi /etc/odbc.ini
  • 最终的 /etc/odbc.ini

    1
    2
    3
    4
    5
    6
    7
    8
    9
    [Neural]
    Description = Data source MySQL
    Driver = MySQL ODBC 8.0 Driver
    Server = x.x.x.x
    Host = x.x.x.x
    Database = xxxx
    Port = 3306
    User = root
    Password = 0000
    • 其中方括号内的是数据源名称,可以任意
    • Description 描述根据自己需要,任意填写
    • Driver 确定是 MySQL ODBC 8.0 Driver
    • Server 和 Host 均为 MySQL 的 IP
    • Database 为需要在 Linux 端使用的数据库
  • 以上步骤走完后,isql Neural 还是无法连接

    image-20210527160249814

  • 参考 https://blog.csdn.net/m0_37210884/article/details/114287684 应该 isql -v Neural root 0000 指明数据库,用户名,密码

    image-20210527160522927

    结果报错不太一样了,其中指出机器不允许连接

2.1.2 解决上文的 S1000 连接问题

参考

  • 原因:root 用户只允许本地登录,细节如下

    • use mysql;

    • SELECT user,host FROM user;

      image-20210527162519904

  • 解决方法:将 root 对应的 host 改为 %,意即所有地址可访问。细节如下

    • update user set host = '%' where user = 'root'; 更新访问权限
    • flush privileges; 刷新访问权限表
    • select user,host from user; 再查看 host 发现已经修改好了

image-20210527162802153

  • 结果:

    • 在 Linux 端 isql -v Neural root 0000 直接进入连接,并使用在 odbc.ini 中我们预先指定的数据库了

      image-20210527162938228

    • show tables;

      image-20210527163038271

大功告成!

2.2 Qt 中使用

上文已经可以在命令行中使用 ODBC 连接远程 MySQL 了,如何在 Qt 中连接呢

根据第 1 节的代码,类似的,我们在 Linux 环境下进行试验,当我们运行程序后,Qt 会报错 QSqlDatabase: QODBC driver not loaded 说明在连接 ODBC 驱动的数据库时,缺少了libqt4-sql-odbc驱动包

解决方法参考

  • sudo apt-get install libqt4-sql-odbc

然后就可以成功连接啦!



----------- 本文结束 -----------




0%