首页 > 数据库 >C语言 & 图形化界面方式连接MySQL【C/C++】【图形化界面组件分享】

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

时间:2024-06-10 15:58:42浏览次数:29  
标签:界面 RES mysql C++ result MYSQL query my 图形化

  博客主页:花果山~程序猿-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知识先到这里了,江湖见

结语

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

标签:界面,RES,mysql,C++,result,MYSQL,query,my,图形化
From: https://blog.csdn.net/qq_72112924/article/details/139542578

相关文章

  • 【四种语言一网打尽(C\C++\Python\Golang)】L1-006 连续因子
    L1-006连续因子一个正整数N的因子中可能存在若干连续的数字。例如630可以分解为3×5×6×7,其中5、6、7就是3个连续的数字。给定任一正整数N,要求编写程序求出最长连续因子的个数,并输出最小的连续因子序列。输入格式:输入在一行中给出一个正整数N(1<N<2^31)。输......
  • C++~~期末复习题目讲解---lijiajia版本
    目录1.类和对象(3)创建对象的个数(3)全局变量,局部变量(4)构造函数的执行次数(5)静态动态析构和构造顺序(6)初始化顺序和声明顺序(7)构造和复制构造(8)拷贝构造的三种情况和例题讲解2.继承和派生(1)派生的构造和析构(2)赋值的兼容性规则3.虚函数1.类和对象(1)类和对象的三个特征:封......
  • 2024年华为OD机试真题-快递员的烦恼-C++-OD统一考试(C卷D卷)
     2024年OD统一考试(D卷)完整题库:华为OD机试2024年最新题库(Python、JAVA、C++合集) 题目描述:快递公司每日早晨,给每位快递员推送需要送到客户手中的快递以及路线信息,快递员自己又查找了一些客户与客户之间的路线距离信息,请你依据这些信息,给快递员设计一条最短路径,告诉他最短路......
  • C&C++内存管理【new和delete操作符的详细分析】【常见面试题】
    C/C++内存管理1.C/C++内存分布我们先来看一段代码,来了解一下C/C++中的数据内存分布。#include<stdlib.h>intglobalVar=1;staticintstaticGlobalVar=1;//比globalVar还要先销毁,同一个文件下后定义的先析构//全局变量存在数据段(静态区)但是链接方式和静......
  • C++Primer Plus 第12章 类和动态内存分配 12.10编程练习第2题new,delete的指向深度拷
    系列文章目录提示:这里可以添加系列文章的所有文章的目录,目录需要自己手动添加例如:本章练习第2题涉及标准函数及关键词toupper,tolower(),strcpy_s(),strcat_s(),strcmp,strlen(),new[],delete[].实现如下效果输出应与下面相似:Pleaseenteryourname:FrettaFarboMynameis......
  • C++多态详解:静态多态与动态多态的实现
    C++中的多态是面向对象编程的重要特性,允许相同的接口调用不同的实现。多态性可以分为两类:静态多态和动态多态。1.静态多态(编译时多态)(1)函数重载(FunctionOverloading):函数重载是一种静态多态,允许同一个函数名在同一作用域内具有不同的参数列表。这些不同的版本在编译时......
  • 深入理解 C++ 动态内存管理:new vs malloc
    概述new/delete 是C++的关键字,需要编译器支持。malloc/free 是库函数,需要头文件支持。使用 new 申请内存分配时无需指定内存块大小,编译器会自动计算。而 malloc 需要明确指定所需内存的大小。new 会返回对象类型的指针,类型安全。而 malloc 返回 void*,需要进行强制......
  • 表达式求值--后缀 C++实现
    #include<iostream>#include<string>#include<stack>usingnamespacestd;intPostFixRun(stringch){stack<int>stk;for(inti=0;i<ch.size();i++){if(ch[i]>='0'&&ch[i]<='9')......
  • 线性表总结(数据结构C++,大二下写,初学者)
    这段时间,我学到了这门课的第一种数据结构——线性表。关于线性表的知识,我总结为三方面:课本上学到的知识、上机实现课本上的例子的过程所学到的知识和力扣做题学到的知识和技巧。顺序表线性表中第一个学到的是顺序表,为此我翻了一下课本。顺序表,顾名思义,是线性表的顺序存储结构......
  • C++实现一个简单的计算器
    使用C++创建一个简单的计算器,可以实现+,-,*,/。#include<iostream>usingnamespacestd;intmain(){charop;floatnum1,num2;cout<<"输入运算符:+、-、*、/:";cin>>op;cout<<"输入两个数:";cin&g......