C语言 & 图形化界面方式连接MySQL【C/C++】【图形化界面组件分享】

博客主页:花果山~程序猿-CSDN博客

文章分栏:MySQL之旅_花果山~程序猿的博客-CSDN博客

关注我一起学习,一起进步,一起探索编程的无限可能吧!让我们一起努力,一起成长!

目录

一.配置开发环境

二,接口介绍

[1. mysql_init](#1. mysql_init)

2.mysql_real_connect

[3. mysql_query](#3. mysql_query)

4.对select结果分析

1),mysql_store_result

2)像mysql一样查看mysql数据

提取数据

提取属性名

三,图形化界面方式连接MYSQL


嗨!收到一张超美的图,愿你每天都能顺心!

一.配置开发环境

我们是要使用C/C++语言在代码层面对MySQL进行连接操作,我们就需要其**头文件 + 源码库,**按照我们之前学的关于如何使用第三方库,可以参考本博客:

使用第三库操作详解【Linux】【软硬链接 | 动,静态库 | 使用第三库】_linux下stderr的头文件-CSDN博客

但以目前我们学到这里,这种步骤成功性还是无法保证(因为我们可以通过安装mysql,会自动代入我们需要的环境)。

因此首先我们是安装mysql软件,可以参考本篇博客:

centos7.6安装mysql-CSDN博客

下载完成后,我们通过下面指令来查看是否有devel(开发库)

cpp 复制代码
rpm -qa | grep mysql

如果devel有,那么我们就可以直接正常编程了,编译的时候指定一下源码库即可,如:

-L/lib64/mysql -lmysqlclient;

如果没有devel,那么我们需要安装一个开发库,通过下面代码:

cpp 复制代码
yum install -y mysql-community-devel

如果无法安装devel(开发库),还可以到官网下载开发包 ,再上传到Linux,但是不推荐怎么做,因为可能会因为开发包和自己MySQL的版本不同而出现各种奇奇怪怪的问题:如ssl证书问题,套接字问题......

下面我们可以手动查一下是否有,头文件 + 源码库

二,接口介绍

这里就只提一些C语言 常用接口,有需要的可以直接找文档,MySQL :: MySQL 5.7 C API Developer Guide :: 4 C API Function Reference

1. mysql_init

信息:mysql_init函数是用于初始化一个MYSQL结构体 的,这个结构体用来存储连接MySQL服务器所需的信息以及连接后的状态信息。

cpp 复制代码
MYSQL *mysql_init(MYSQL *mysql); // 如果第一次初始,设置为nullptr即可

返回值:成功时,返回指向初始化后的MYSQL结构体的指针。如果分配新对象时失败,则返回NULL

2.mysql_real_connect

与mysql服务端建立连接(首先我们要有mysqld的账号)。 如果通过我们写的程序来连接服务端,那我们就成了客户端了,我觉得没这个必要,我们想通过程序来进行,简化对mysql命令的操作,实现自动化提高效率。

cpp 复制代码
MYSQL*  mysql_real_connect(MYSQL *mysql,      //初始化好的mysql*结构体
                   const char *host,  // 登录主机
                   const char *user,   // 用户
                   const char *passwd, // 密码
                   const char *db,     // 默认进入的库名, 可以为nullptr
                   unsigned int port,  // 服务器端口号
                   const char *unix_socket, // 套接字种类,一般是域间套接字,可以默认为nullptr
                   unsigned long client_flag) // 默认为0

返回值:成功时,返回mysql,填入的初始化结构体指针;失败,返回nullptr;

关于C连接mysql编码集的问题:

我们知道已经设置了服务器的默认编码集:utf8 ,但C连接mysql的编码集默认是latin1,不支持中文,因此我们需要修改默认编码集。

cpp 复制代码
int  mysql_set_character_set(MYSQL *mysql,  const char *csname)  // csname 可为 "utf8"

3. mysql_query

在我们在mysql中创建表后,我们就可以通过mysql_query来向mysql发送mysql指令

cpp 复制代码
int  mysql_query(MYSQL *mysql, 
                 const char *stmt_str)  --mysql语句

返回值:成功,返回0;失败,返回其他值

最简单的就是增删改,案例如下:

cpp 复制代码
    mysql_set_character_set(my_sql, "utf8");
    std::string query = "insert  people values('张三', '12345', 1), ('李四', '520', 2)";
    // query = "delete from people where name = '张三';
    // query = 'update people set phone='1314' where id=2'

    if (mysql_query(my_sql, query.c_str()))
    {
        std::cout << "insert fail" << std::endl;
        fprintf(stderr, "错误原因:%s", mysql_error(my_sql));
    }

就数增,删,改比较简单,因为就只有两种结果。难的是,对select 内容如何分析。

4.对select结果分析

1),mysql_store_result

功能:该变量会开辟块空间 ,专门在内存中接收查询出来的结果 ,作为未来函数的数据来源

cpp 复制代码
MYSQL_RES* mysql_store_result(MYSQL *mysql)

怎么理解这个新的返回类型:MYSQL_RES,我们可以这样简单的理解:简单理解来说是一个 char**的数组


该函数会调用 MYSQL 变量中的 st_mysql_methods 中的 read_rows 函数指针来获取查询的结果。
同时该函数会返回 MYSQL_RES 这样一个变量,该变量主要用于保存查询的结果
同时该函数 malloc 了一片内存空间来存储查询过来的数据,所以我们一定要记的 free(result), 不然是肯定会造成内存泄漏的。

调用的free结果集的函数是:

void mysql_free_result (MYSQL_RES *result)

2)像mysql一样查看mysql数据

在上面我们大概知道了MySQL_RES的基本结构,同时,mysql也是通过C/C++实现,模拟mysql客户端打印结果并不难,学习步骤如下:

获取行,列

my_ulonglong mysql_num_rows ( MYSQL_RES * res ); -- 获取行 // my_ulonglong 就是 unsigned long long
my_ulonglong mysql_num_fields ( MYSQL_RES * res ); -- 获取列

提取数据

如何循环获取MYSQL_RES中的内容,先了解下面两个接口

MYSQL_ROW mysql_fetch_row (MYSQL_RES *result)

功能:每次调用返回列的起始地址,并向后移动一位。通过查看MYSQL_ROW的源代码可知

mysql_fetch_row 类似于迭代器的函数,每次调用将自动"++",往后移动

截取的案例:

cpp 复制代码
    MYSQL_ROW line = 0;
    for (int n = 0; n < rows; n++)
    {
        line = mysql_fetch_row(result);
        for (int k = 0; k < field; k++)
        {
            std::cout << line[k] << "\t";
        }
        std::cout << std::endl;
    }

提取属性名

上面我们能查找到内容,但并没有属性框,也就是不知道每个列名,可以通过下面函数进行获取

MYSQL_FIELD * mysql_fetch_field (MYSQL_RES *result)

返回值:返回一个结构体指针,该结构体里存放着每个列的属性数据

使用案例:

cpp 复制代码
    MYSQL_FIELD* qual =  mysql_fetch_field(result);
    for (int j = 0; j < field; j++)
    {
        std::cout << qual[j].name << "\t";
    }
    std::cout << std::endl;

另外, mysql C api 还支持事务等常用操作,大家下来自行了解 :

my_bool STDCALL mysql_autocommit(MYSQL * mysql, my_bool auto_mode);
my_bool STDCALL mysql_commit(MYSQL * mysql);
my_bool STDCALL mysql_rollback(MYSQL * mysql);

三,图形化界面方式连接MYSQL

使用mysql,我们已经可以通过1.通过mysql客户端命令行操作。2. C语言代码方式连接mysql 第三种就是使用最简单的图形化界面方式来操作mysql。

使用比较好推荐:

1.PHPMyandmin(免费,体验良好)

安装流程:CentOS7 安装 phpMyAdmin - helloliyh - 博客园 (cnblogs.com)

(亲测基本上没有遇到啥问题,需要的注意点就是买的服务器,不仅需要修改自己的防火墙,而且需要在服务器控制台添加安全组

使用教程:phpMyAdmin使用教程-CSDN博客

2.Navicat(收费但魔法,体验良好)

3.Mysql workbench(官方标配免费,但体验一般)

mysql知识先到这里了,江湖见

结语

本小节就到这里了,感谢小伙伴的浏览,如果有什么建议,欢迎在评论区评论,如果给小伙伴带来一些收获,请动动你发财的小手点个免费的赞,你的点赞和关注永远是博主创作的动力源泉。

相关推荐
zpjing~.~25 分钟前
Mongo 分页判断是否有下一页
数据库
2401_8576009526 分钟前
技术与教育的融合:构建现代成绩管理系统
数据库·oracle
2301_819287121 小时前
ce第六次作业
linux·运维·服务器·网络
秋恬意1 小时前
Mybatis能执行一对一、一对多的关联查询吗?都有哪些实现方式,以及它们之间的区别
java·数据库·mybatis
武汉联从信息1 小时前
如何使用linux日志管理工具来管理oracle osb服务器日志文件?
linux·运维·服务器
天天进步20151 小时前
STUN服务器实现NAT穿透
运维·服务器
月如琉璃1 小时前
1.gitlab 服务器搭建流程
服务器·gitlab
潇湘秦1 小时前
一文了解Oracle数据库如何连接(1)
数据库·oracle
雅冰石1 小时前
oracle怎样使用logmnr恢复误删除的数据
数据库·oracle
web前端神器1 小时前
mongodb给不同的库设置不同的密码进行连接
数据库·mongodb