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

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

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

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

在这里插入图片描述

目录

一.配置开发环境 

二,接口介绍

1. mysql_init

2.mysql_real_connect

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(开发库)

rpm -qa | grep mysql

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

-L/lib64/mysql   -lmysqlclient;

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

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服务器所需的信息以及连接后的状态信息

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

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

2.mysql_real_connect

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

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,不支持中文,因此我们需要修改默认编码集。

int  mysql_set_character_set(MYSQL *mysql,  const char *csname)  // csname 可为 "utf8"

3. mysql_query

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

int  mysql_query(MYSQL *mysql, 
                 const char *stmt_str)  --mysql语句

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

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

    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

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

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类似于迭代器的函数,每次调用将自动“++”,往后移动

截取的案例: 

    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)

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

使用案例:

    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知识先到这里了,江湖见

结语

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/696454.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

为什么选择海外服务器?

如何选择跨境电商服务器&#xff1a;详细指南 选择合适的服务器是跨境电商企业成功的基础。服务器的性能和稳定性直接影响着网站的访问速度、用户体验和安全性&#xff0c;进而影响着企业的销量和利润。那么&#xff0c;跨境电商企业该如何选择服务器呢&#xff1f; ​​​​​…

【微信小程序】事件传参的两种方式

文章目录 1.什么是事件传参2.data-*方式传参3.mark自定义数据 1.什么是事件传参 事件传参:在触发事件时&#xff0c;将一些数据作为参数传递给事件处理函数的过程&#xff0c;就是事件传参 在微信小程序中&#xff0c;我们经常会在组件上添加一些自定义数据&#xff0c;然后在…

0元白嫖阿里云4G内存云服务器——感谢伟大的CSDN和阿里云

&#x1f9f8;欢迎来到dream_ready的博客&#xff0c;&#x1f4dc;相信您对博主首页也很感兴趣o (ˉ▽ˉ&#xff1b;) 学生邮箱白嫖/免费安装JetBrains全家桶(IDEA/pycharm等) —— 保姆级教程-CSDN博客 目录 1、学生认证领取300元优惠券 ​2、购买云服务器 1、学生认证领取…

车载电子电气架构 - 智能座舱基础技术

我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 屏蔽力是信息过载时代一个人的特殊竞争力,任何消耗你的人和事,多看一眼都是你的不对。非必要不费力证明自己,无利益不试图说服别人,是精神上的节…

STM32CubeIDE使用过程记录

最近在做一款机器人的开发&#xff0c;使用到了STM32CubeIDE&#xff0c;这里记录一些使用技巧方便后续查阅。 STM32CubeIDE使用过程记录 快捷键开启代码自动补全功能看门狗设置CRC设置IO口取反定时器设置 及 定时器中断外部中断GPIO配置STC15单片机GPIO模式配置片内闪存&#…

【Python教程】3-控制流、循环结构与简单字符串操作

在整理自己的笔记的时候发现了当年学习python时候整理的笔记&#xff0c;稍微整理一下&#xff0c;分享出来&#xff0c;方便记录和查看吧。个人觉得如果想简单了解一名语言或者技术&#xff0c;最简单的方式就是通过菜鸟教程去学习一下。今后会从python开始重新更新&#xff0…

frida hook微信防撤回(PC端)

PC端&#xff1a; 微信的主要功能都是在WeChat\[3.9.10.27]\WeChatWin.dll动态链接库中实现的 直接进IDA分析 都没有符号表 我们需要找一下实现撤回功能的函数&#xff0c;尝试在字符串里搜索revokeMsg 也是有非常多的字符串 我们需要用frida来hook这些字符串来找出撤回实际…

初识volatile

volatile&#xff1a;可见性、不能保证原子性(数据不安全)、禁止指令重排 可见性&#xff1a;多线程修改共享内存的变量的时候&#xff0c;修改后会通知其他线程修改后的值&#xff0c;此时其他线程可以读取到修改后变量的值。 指令重排&#xff1a;源代码的代码顺序与编译后字…

【学习】DCMM认证提升企业竞争优势的表现

DCMM认证是企业提升数据管理能力的重要途径。它不仅可以帮助企业评估自身的数据管理水平&#xff0c;还可以为企业提供改进的方向和目标。在数字化时代&#xff0c;拥有强大的数据管理能力是企业成功的关键。因此&#xff0c;通过DCMM认证&#xff0c;企业可以更好地适应数字化…

ARM交叉编译

目录 一、介绍 1、本地编译 2、交叉编译 二、交叉工具链 1、概念 2、工具 3、获取方法 三、交叉编译运行程序 1、pc机操作&#xff08;x86_64&#xff09; ​2、开发板操作&#xff08;ARM&#xff09; 一、介绍 1、本地编译 本地编译是在与目标运行环境相同的机器上…

大模型训练的艺术:从预训练到增强学习的四阶段之旅

文章目录 大模型训练的艺术&#xff1a;从预训练到增强学习的四阶段之旅1. 预训练阶段&#xff08;Pretraining&#xff09;2. 监督微调阶段&#xff08;Supervised Finetuning, SFT&#xff09;3. 奖励模型训练阶段&#xff08;Reward Modeling&#xff09;4. 增强学习微调阶段…

FreeRTOS消息队列

消息队列简介 队列是为了任务与任务、 任务与中断之间的通信而准备的&#xff0c; 可以在任务与任务、 任务与中断之间传递消息&#xff0c; 队列中可以存储有限的、 大小固定的数据项目。任务与任务、 任务与中断之间要交流的数据保存在队列中&#xff0c; 叫做队列项目。 队…

【博士每天一篇文献-综述】Modularity in Deep Learning A Survey

阅读时间&#xff1a;2023-12-8 1 介绍 年份&#xff1a;2023 作者&#xff1a;孙浩哲&#xff0c;布朗克斯医疗卫生系统 会议&#xff1a; Science and Information Conference 引用量&#xff1a;4 论文主要探讨了深度学习中的模块化&#xff08;modularity&#xff09;概念…

ROS学习记录:C++节点发布自定义地图

前言 ROS栅格地图格式 在了解了ROS地图消息包的数据结构后(链接在上)&#xff0c;本文将编写一个节点&#xff0c;发布地图消息包&#xff0c;看看在RViz中显示是什么效果。 一、准备 1、为了简单起见&#xff0c;发布一个两行四列的地图 2、为了便于观测&#xff0c;只对地…

沐风老师3DMAX一键多孔结构建模插件Porous使用方法

​3DMAX一键多孔结构建模插件Porous使用教程 3dMax是大家熟知的3D建模软件之一&#xff0c;其功能非常的强大&#xff0c;在科研绘图领域有着非常广泛的应用&#xff0c;但是由于科研绘图的图形&#xff08;模型&#xff09;一般都属于异形结构&#xff0c;手工绘制建模&#x…

Seq2seq、编码器解码器神经网络

目录 一、Seq2seq 简介二、编码器三、解码器四、编码器-解码器的训练 遇到看不明白的地方&#xff0c;欢迎在评论中留言呐&#xff0c;一起讨论&#xff0c;一起进步&#xff01; 需掌握的前提知识&#xff1a; LSTM、词嵌入 本文参考&#xff1a;【官方双语】编码、解码神经网…

人类记忆优化算法:针对全局优化问题的记忆启发优化器

Human memory optimization algorithm: A memory-inspired optimizer for global optimization problems 24年 Expert Systems With Applications sci一区 原文链接: https://doi.org/10.1016/j.eswa.2023.121597 Zhu D, Wang S, Zhou C, et al. Human memory optimization alg…

【机器学习】GPT-4中的机器学习如何塑造人类与AI的新对话

&#x1f680;时空传送门 &#x1f50d;引言&#x1f4d5;GPT-4概述&#x1f339;机器学习在GPT-4中的应用&#x1f686;文本生成与摘要&#x1f388;文献综述与知识图谱构建&#x1f6b2;情感分析与文本分类&#x1f680;搜索引擎优化&#x1f4b4;智能客服与虚拟助手&#x1…

Web--CSS基础

文章目录 定义方式选择器文本字体背景边框元素展示格式内边距与外边距盒子模型位置浮动flex布局响应式布局 定义方式 行内样式表 直接定义在style属性中&#xff0c;作用于当前标签 <img src "/imges/logo.jpg" alt "" style "width 400"…

时钟影响ADC性能不仅仅是抖动

时钟影响ADC性能除了抖动&#xff0c;还有占空比。 在高速AD采样中&#xff0c;时钟占空比是非常重要的一个参数。时钟信号的上升沿控制ADC的采样&#xff0c;而下降沿控制着信号的保持&#xff0c;在一个周期内才可以完成量化输出&#xff0c;所以必须保持时钟的占空比为50%&…