前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >QT进阶学习——如何通过QT连接云服务器的MySQL数据库并进行数据库操作 和 数据表的增删改查

QT进阶学习——如何通过QT连接云服务器的MySQL数据库并进行数据库操作 和 数据表的增删改查

原创
作者头像
Arya
发布2024-10-23 13:00:27
450
发布2024-10-23 13:00:27

引出


QT进阶学习——如何通过QT连接云服务器的MySQL数据库并进行数据库操作 和 数据表的增删改查

连接本地MySQL

1.首先下载MySQL的ODBC驱动

MySQL :: Download Connector/ODBC

首先在MySQL的官网上下载ODBC,我这里选择第一个,64位的安装包;

下载完成后,点击运行,进行ODBC的安装

2.启动运行,创建用户数据源

通过控制台命令启动ODBC数据源管理程序,添加ODBC ANSI 驱动;注意这里的datasourcename需要用到!!!

代码语言:java
复制
cd \Windows\SysWOW64
odbcad32.exe

注意这里的Data Source Name 后面在qt中需要用到

点击test,测试连接是否成功

注意上面的Data Source Name 在后面的qt中建立Mysql连接时需要用到;

补充:ANSI 版和 Unicode 版

ODBC(开放数据库连接)驱动程序有两种版本:ANSI 版和 Unicode 版。它们之间的主要区别在于它们处理字符串数据的方式。

  1. ANSI 版 ODBC
  • 字符编码:ANSI 版 ODBC 使用本地操作系统的默认字符编码。例如,在 Windows 上,它通常使用 Windows-1252 或其他基于系统区域设置的编码。
  • 函数后缀:ANSI 版 ODBC 函数通常以 A 结尾。例如,SQLConnect 的 ANSI 版本是 SQLConnectA
  • 字符类型:ANSI 版 ODBC 函数使用 char 类型来处理字符串。
  • 兼容性:适用于那些只需要处理单字节字符集(SBCS)或双字节字符集(DBCS)的应用程序。
  1. Unicode 版 ODBC
  • 字符编码:Unicode 版 ODBC 使用宽字符编码(例如 UTF-16)。这使得它能够处理多种语言和字符集。
  • 函数后缀:Unicode 版 ODBC 函数通常以 W 结尾。例如,SQLConnect 的 Unicode 版本是 SQLConnectW
  • 字符类型:Unicode 版 ODBC 函数使用 wchar_t 类型来处理字符串。
  • 兼容性:适用于需要处理多字节字符集(MBCS)和各种语言的应用程序。

比较与选择

选择使用 ANSI 版还是 Unicode 版 ODBC 取决于你的应用程序的需求:

  • 字符集需求:如果你的应用程序只需要处理 ASCII 或单字节字符集,ANSI 版可能就足够了。如果需要处理多语言或多字符集,Unicode 版是更好的选择。
  • 兼容性:某些老旧的系统和数据库可能仅支持 ANSI 版 ODBC。如果你的应用程序需要与这些系统兼容,使用 ANSI 版可能会更好。
  • 国际化:如果你的应用程序需要国际化支持(如处理不同语言的字符),建议使用 Unicode 版。

3.qt代码连接

代码语言:java
复制
    connect(ui->pushButton_2,&QPushButton::clicked,this,[=](){
        // 使用ODBC驱动
        QSqlDatabase db = QSqlDatabase::addDatabase("QODBC");
        db.setHostName("127.0.0.1"); // 云数据库的主机地址
        db.setPort(3306); // 端口
        db.setDatabaseName("mydatasource"); // 数据库名称
        db.setUserName("root"); // 用户名
        db.setPassword("123"); // 密码
        bool ok = db.open();
        qDebug() << ok;
        if (!ok) {
            qDebug() << "Database error occurred:" << db.lastError().text();
        }

        qDebug() << QSqlDatabase::drivers();
    });

如何连接华为云服务器中的MySQL

1.在Centos中安装Linux版本的ODBC驱动

通过以下命令安装Linux版本的ODBC驱动

代码语言:java
复制
sudo yum install mysql-connector-odbc

报错解决方案一:改check为 0 ,但是没有生效,估计是没有把这个文件重新载入??

代码语言:java
复制
vim /etc/yum.repos.d/epel.repo

解决方案2:执行命令后面加入参数--nogpgcheck,忽略检查

代码语言:java
复制
sudo yum install mysql-connector-odbc --nogpgcheck

如果遇到报错可以忽略检查,就可以安装成功

2.在ODBC连接管理器中建立和华为云的链接

和本地MySQL的链接类似,这里需要先通过ODBC建立和华为云中数据库的连接;然后QT访问ODBC,进而对云数据库进行相关操作

3.qt代码通过ODBC连接华为云

代码语言:java
复制
connect(ui->pushButton,&QPushButton::clicked,this,[=](){
        qDebug() << "\n======进行数据库的链接====";

        QSqlDatabase db = QSqlDatabase::addDatabase("QODBC"); // 使用 QMYSQL 驱动
        db.setHostName(""); // 云数据库的主机地址
        db.setPort(3306); // 端口
        db.setDatabaseName("huawei"); // 数据库名称
        db.setUserName("root"); // 用户名
        db.setPassword(""); // 密码

        if (!db.open()) {
            qDebug() << "Database error occurred:" << db.lastError().text();
            return;
        }

        qDebug() << "连接成功";

    });

报错解决

报错:QSqlDatabase: ODBC driver not loaded,这里是写错了

报错解决:Access denied for user 'root@localhost'

这里我们需要修改权限,允许其他ip通过root用户访问MySQL

代码语言:java
复制
 update user set Host='%' where User='root';
代码语言:java
复制
flush privileges;
flush hosts;

QT连接华为云MySQL

创建连接

通过QSqlDatabase设置和华为云数据库的连接,需要指定驱动,然后设置主机端口,数据库名称,用户名和密码

代码语言:java
复制
bool MainWindow::connectMySQL(){
    qDebug() << "\n======进行数据库的链接====";

    dbWeb = QSqlDatabase::addDatabase("QODBC"); // 使用 QMYSQL 驱动
    dbWeb.setHostName(""); // 云数据库的主机地址
    dbWeb.setPort(3306); // 端口
    dbWeb.setDatabaseName("huawei"); // 数据库名称
    dbWeb.setUserName("root"); // 用户名
    dbWeb.setPassword(""); // 密码

    if (!dbWeb.open()) {
        qDebug() << "Database error occurred:" << dbWeb.lastError().text();
        return false;
    }

    qDebug() << "连接成功";
    return true;
}

数据库操作和表创建

查询现有的数据库

查询现有的所有数据库,通过QT中提供的QSqlQuery进行查询

代码语言:java
复制
void MainWindow::queryDataBase(QSqlDatabase db){
    // 查询数据库的库
    qDebug() << "\n========查询库========";
    QSqlQuery query(db);
    if(query.exec("SHOW DATABASES")){
        while (query.next()) {
            QString databaseName = query.value(0).toString();
            qDebug() << "DB" << databaseName;
        }
    }else {
        qDebug() << "error:" << dbWeb.lastError().text();
    }
}

控制台打印出查询的结果

创建数据库

执行新建数据库的操作,通过query进行执行

函数功能优化,支持输入数据库的名称进行新建数据库

代码语言:java
复制
void MainWindow::createDataBase(QSqlDatabase db, QString dbName){
    qDebug() << "\n=======创建数据库" << dbName << "=======";
    queryDataBase(db);

    // 新建数据库
    QSqlQuery query(db);
    QString q = "CREATE DATABASE IF NOT EXISTS " + dbName;
    if(!query.exec(q)){
        qDebug() << "error:" << db.lastError().text();
    }

    queryDataBase(db);
}

在库中创建表

在ODBC中设置数据库

首先在ODBC中编辑连接,选择DataBase为想要插入的表,选择Database下拉菜单,可以看到我们放个创建的数据表,这里选择example_db这个数据库

编写代码执行,在数据库中创建一张新的表

代码语言:java
复制
	    QSqlQuery query(db);
        QString createTableQuery = R"(CREATE TABLE IF NOT EXISTS Person (
            id INTEGER,
            name TEXT,
            age INTEGER
        ))";

        if (!query.exec(createTableQuery)) {
            qDebug() << "Error: Unable to create table." << query.lastError();
        }

数据表的操作--增删改查

数据增加插入

通过qt往华为云的数据库中插入数据,我们设置了主键自增,所以只需要传名字和年龄即可;

代码语言:java
复制
bool MainWindow::insertData(QSqlDatabase db,const QString &name,int age){
//    qDebug() << "\n========插入数据=======";
    QSqlQuery query(db);
    query.prepare("INSERT INTO Person (name, age) VALUES (:name, :age)");
    query.bindValue(":name", name);
    query.bindValue(":age", age);

    if (!query.exec()) {
        qDebug() << "Error: Unable to insert data into table 'Person'." << query.lastError();
        return false;
    }
    return true;
}

数据的删除

两种删除的方式:

1.通过id删除,通过数据表的主键进行删除,一次删除一个数据;

2.通过名字删除,会一次删除多行数据;

代码语言:java
复制
bool MainWindow::deleteByName(QSqlDatabase db, const QString &name){
    QSqlQuery query(db);

    query.prepare("DELETE FROM Person WHERE name = :name");
    query.bindValue(":name", name);

    if (!query.exec()) {
        qDebug() << "Error: Unable to delete data from table 'Person' by name." << query.lastError();
        return false;
    }

    return true;
}

bool MainWindow::deleteByID(QSqlDatabase db, int id){
    QSqlQuery query(db);

    query.prepare("DELETE FROM Person WHERE id = :id");
    query.bindValue(":id", id);

    if (!query.exec()) {
        qDebug() << "Error: Unable to delete data from table 'Person' by id." << query.lastError();
        return false;
    }

    return true;
}

数据的修改

选择id为特定值的数据进行修改,可以同时修改名字和年龄,也可以只修改名字,或者只需改年龄;

如果年龄输入-1,则只修改名字

如果名字为空,则只修改年龄

代码语言:java
复制
bool MainWindow::updateByID(QSqlDatabase db, int id, const QString &newName,int newAge){

    QSqlQuery query(db);

    // 构建更新SQL语句
    QString updateQuery = "UPDATE Person SET";
    bool nameToUpdate = !newName.isEmpty();
    bool ageToUpdate = newAge != -1;

    if (nameToUpdate) {
        updateQuery += " name = :name";
    }
    if (ageToUpdate) {
        if (nameToUpdate) {
            updateQuery += ",";
        }
        updateQuery += " age = :age";
    }
    updateQuery += " WHERE id = :id";

    query.prepare(updateQuery);

    if (nameToUpdate) {
        query.bindValue(":name", newName);
    }
    if (ageToUpdate) {
        query.bindValue(":age", newAge);
    }
    query.bindValue(":id", id);

    if (!query.exec()) {
        qDebug() << "Error: Unable to update data in table 'Person' by id." << query.lastError();
        return false;
    }

    return true;

}

数据的查询

首先重写实体类的<< 方法,提供格式化输出函数,方便控制台打印查看

代码语言:java
复制
QDebug operator<<(QDebug dbg, const Person &data) {
    dbg.nospace() << "person("
           << QString::number(data.id) << ","
           << data.name  << ","
           << QString::number(data.age)  << ")";
    return dbg.space();
}

根据ID查询单个

设置了主键自增,是唯一的,所有通过id查询,会查询到一个数据;

代码语言:java
复制
Person MainWindow::queryById(QSqlDatabase db, int id){
    QSqlQuery query(db);

    query.prepare("SELECT name, age FROM Person WHERE id = :id");
    query.bindValue(":id", id);

    if (!query.exec()) {
        qDebug() << "Error: Unable to query data from table 'Person' by id." << query.lastError();
        return Person(-1,"",-1);
    }

    if (query.next()) {
        QString name = query.value("name").toString();
        int age = query.value("age").toInt();
        return Person(id, name, age);
    }

    return Person(-1,"",-1);;
}

根据name查询多个

人员的名字会重复,一次性会查询出多个,所以用一个容器进行数据的接收。

代码语言:java
复制
// 根据名字查询多个
std::vector<Person> MainWindow::queryByName(QSqlDatabase db, const QString &name){
    QSqlQuery query(db);

    query.prepare("SELECT id, name, age FROM Person WHERE name = :name");
    query.bindValue(":name", name);

    std::vector<Person> persons;

    if (!query.exec()) {
        qDebug() << "Error: Unable to query data from table 'Person' by name." << query.lastError();
        return persons;
    }

    while (query.next()) {
        int id = query.value("id").toInt();
        QString name = query.value("name").toString();
        int age = query.value("age").toInt();
        persons.emplace_back(id, name, age);
    }

    return persons;
}

总结

QT进阶学习——如何通过QT连接云服务器的MySQL数据库并进行数据库操作 和 数据表的增删改查

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 引出
  • 连接本地MySQL
    • 1.首先下载MySQL的ODBC驱动
      • 2.启动运行,创建用户数据源
        • 补充:ANSI 版和 Unicode 版
      • 3.qt代码连接
      • 如何连接华为云服务器中的MySQL
        • 1.在Centos中安装Linux版本的ODBC驱动
          • 2.在ODBC连接管理器中建立和华为云的链接
            • 3.qt代码通过ODBC连接华为云
              • 报错解决
                • 报错:QSqlDatabase: ODBC driver not loaded,这里是写错了
                • 报错解决:Access denied for user 'root@localhost'
            • QT连接华为云MySQL
              • 创建连接
              • 数据库操作和表创建
                • 查询现有的数据库
                  • 创建数据库
                    • 在库中创建表
                      • 在ODBC中设置数据库
                  • 数据表的操作--增删改查
                    • 数据增加插入
                      • 数据的删除
                        • 数据的修改
                          • 数据的查询
                            • 根据ID查询单个
                            • 根据name查询多个
                        • 总结
                        相关产品与服务
                        云数据库 MySQL
                        腾讯云数据库 MySQL(TencentDB for MySQL)为用户提供安全可靠,性能卓越、易于维护的企业级云数据库服务。其具备6大企业级特性,包括企业级定制内核、企业级高可用、企业级高可靠、企业级安全、企业级扩展以及企业级智能运维。通过使用腾讯云数据库 MySQL,可实现分钟级别的数据库部署、弹性扩展以及全自动化的运维管理,不仅经济实惠,而且稳定可靠,易于运维。
                        领券
                        问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档