16 C语言连接

使用c语言连接mysql,需要使用mysql官网提供的库,可以在官网下载

准备工作:

保证mysql服务有效
官网下载合适的mysql connect库

也可以直接安装mysql服务

yum install -y mysql-devel

Connector/C使用

库格式如下:

[hb@MiWiFi-R1CL-srv lib]$ tree ..├── include│   
├── big_endian.h  
├── byte_order_generic.h├── byte_order_generic_x86.h├── decimal.h├── errmsg.h├── keycache.h├── little_endian.h├── m_ctype.h├── m_string.h├── my_alloc.h├── my_byteorder.h├── my_compiler.h├── my_config.h├── my_dbug.h├── my_dir.h├── my_getopt.h├── my_global.h├── my_list.h├── my_pthread.h├── mysql  
├── client_authentication.h├── client_plugin.h├── client_plugin.h.pp├── get_password.h├── plugin_auth_common.h├── plugin_trace.h├── psi 
├── mysql_file.h├── mysql_idle.h├── mysql_mdl.h├── mysql_memory.h├── mysql_ps.h├── mysql_socket.h├── mysql_sp.h
├── mysql_stage.h  
├── mysql_statement.h├── mysql_table.h├── mysql_thread.h├── mysql_transaction.h├── psi_base.h├── psi.h└── psi_memory.h├── service_my_snprintf.h└── service_mysql_alloc.h├── mysql_com.h├── mysql_com_server.h├── mysqld_ername.h├── mysqld_error.h├── mysql_embed.h├── mysql.h├── mysql_time.h├── mysql_version.h├── my_sys.h├── my_xml.h├── sql_common.h├── sql_state.h├── sslopt-case.h├── sslopt-longopts.h├── sslopt-vars.h└── typelib.h└── lib├── libmysqlclient.a├── libmysqlclient_r.a -> libmysqlclient.a├── libmysqlclient_r.so -> libmysqlclient.so├── libmysqlclient_r.so.18 -> libmysqlclient.so.18├── libmysqlclient_r.so.18.3.0 -> libmysqlclient.so.18.3.0├── libmysqlclient.so -> libmysqlclient.so.18├── libmysqlclient.so.18 -> libmysqlclient.so.18.3.0└── libmysqlclient.so.18.3.0

其中inlcude包含所有的方法声明,lib包含所有的方法实现(打包成库)
尝试连接mysql client
通过mysql_get_client_info()函数,验证是否成功

#include <stdio.h>
#include <mysql.h>  
int main(){printf("mysql client Version: %s\n", mysql_get_client_info());return 0;}[@MiWiFi-R1CL-srv lib]$ gcc -o test test.c -I./include -L./lib -lmysqlclient[@MiWiFi-R1CL-srv lib]$ lsinclude  lib  test  test.c[@MiWiFi-R1CL-srv lib]$ ./test./test: error while loading shared libraries: libmysqlclient.so.18: cannot open 
shared object file: No such file or directory
[@MiWiFi-R1CL-srv lib]$ export LD_LIBRARY_PATH=./lib #动态库查找路径,讲解ldd命令
[@MiWiFi-R1CL-srv lib]$ ./testmysql client Version: 6.1.6

至此引入库的工作已经做完,接下来是熟悉接口

接口介绍

初始化mysql_init()

要使用库,先进行初始化

MSYQL *mysql_init(MYSQL* mysql);

如:MYSQL* mfp = mysql_init(NULL)

连接数据库mysql_real_connect

初始化完毕后,必须先连接数据库,在进行后续操作(mysql网络部分是基于TCP/IP的)

MYSQL *mysql_real_connect(MYSQL *mysql, const char *host,const char *user,const char *passwd,const char *db,unsigned int port,const char *unix_socket,unsigned long clientflag);//建立好链接之后,获取英文没有问题,如果获取中文是乱码:
//设置链接的默认字符集是utf8,原始默认是latin1mysql_set_character_set(myfd, "utf8");

第一个参数MYSQL是C api中一个非常重要的变量(mysql_init的返回值),里面内存非常丰富,有port,dbname,charset等连接基本参数。也包含了一个叫st_mysql_methods的结构体变量,该变量里面保存着很多函数指针,这些函数指针将会在数据库连接成功后的各种数据操作中被调用

下发mysql命令mysql_query

int mysql_query(MYSQL* mysql, cost char* q);

第一个参数已经介绍过了,第二个参数为要执行的sql语句,如“select * from table”
获取执行结果mysql_store_result

sql执行完毕以后,如果是查询语句,还要读取数据,如果update,insert等语句,就看下操作成功与否。看看如何获取查询结果:如果mysql_query返回成功,就通过mysql_store_result函数读取结果,原型如下:

MYSQL_RES* mysql_store_result(MYSQL* mysql);

该函数会调用MYSQL变量中的st_mysql_methods中的read_rows函数指针获取查询的结果。同时该函数会返回MYSQL_RES这样一个变量,该变量用于保存查询的结果。同时该函数malloc了一片内存空间存储查询的数据,一定要记住free(result),不然肯定会造成内存泄露的。执行完mysql_store_result后,数据都在MYSQL_RES变量中了,下面的api基本就是读取MYSQL_RES的数据

在这里插入图片描述
这个结构是一个二维数组,每一行对应数据表的一条记录,一行每个数据对应每个字段

  • 获取结果行数mysql_num_rows

my_ulonglong mysql_num_rows(MYSQL_RES* res);

  • 获取结果列数mysql_num_fields

unsigned int mysql_num_fields(MYSQL_RES* res);

  • 获取列名mysql_fetch_fields

MYSQL_FIELD* mysql_fetch_fields(MYSQL_RES* res);

如:

int fields = mysql_num_fields(res);MYSQL_FIELD *field = mysql_fetch_fields(res);int i = 0;for(; i < fields; i++){cout<<field[i].name<<" ";}cout<<endl;
  • 获取结果内容mysql_fetch_row

MYSQL_ROW mysql_fetch_row(MYSQL_RES* result);

它会返回一个MYSQL_ROW变量,MYSQL_ROW其实就是char**,当成一个二维数组用

i = 0;MYSQL_ROW line;for(; i < nums; i++){line = mysql_fetch_row(res);int j = 0;for(; j < fields; j++){cout<<line[j]<<" ";}cout<<endl;}
  • 关闭mysql连接mysql_close

另外,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);

test.cpp

#include <iostream>
#include <mysql/mysql.h>
#include <unistd.h>using namespace std;
const char *host = "localhost";
const char *user = "connect";
const char *password = "1234";
const char *db = "con";
unsigned int port = 3306;int main()
{//printf("mysql client version: %s\n", mysql_get_client_info());MYSQL *my = mysql_init(nullptr);if (my == nullptr){cerr << "mysql init error" << endl;}if (mysql_real_connect(my, host, user, password, db, port, nullptr, 0) == nullptr){cerr << "mysql connect error" << endl;}mysql_set_character_set(my, "utf8");// const char *sql = "update person set name='zhangqiang' where id = 2";// const char *sql = "insert into person values(5, '李三', 18);";// const char *sql = "delete from person where id = 4";const char *sql = "select * from person";int n = mysql_query(my, sql);if (n == 0){cout << "success" << endl;}else{cout << "failed" << endl;return 3;}MYSQL_RES *res = mysql_store_result(my);if (res == nullptr){cerr << "result get error" << endl;return 4;}my_ulonglong rows = mysql_num_rows(res);my_ulonglong fields = mysql_num_fields(res);cout << rows << "行" << fields << "列" << endl;// 属性MYSQL_FIELD *field = mysql_fetch_field(res);for (int i = 0; i < fields; i++){cout << field[i].name << "\t\t";}cout << endl;// 获取结果内容for (int i = 0; i < rows; i++){// 迭代器功能MYSQL_ROW row = mysql_fetch_row(res);for (int j = 0; j < fields; j++){cout << row[j] << "\t\t";}cout << endl;}// sleep(10);cout << "connect success" << endl;mysql_free_result(res);mysql_close(my);return 0;
}

makefile

mytest: test.cppg++ -o mytest test.cpp -std=c++11 -L/lib64/mysql -lmysqlclient
.PHONY: clean
clean:rm -f *.o mytest 

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

监控平台之nodejs模拟后端接口

github&#xff1a;可以下载进行实验 https://github.com/Mr-Shi-root/sdk-platform/tree/master 1.配置node环境&#xff0c;安装express cors body-parser babel/cors body-parser - node.js 中间件&#xff0c;用于处理 JSON, Raw, Text 和 URL 编码的数据。cookie-parse…

VR虚拟驾驶未来发展_vr自动驾驶汽车所带来的改变

在自动驾驶汽车的基础上&#xff0c;VR虚拟现实技术的应用也让自动驾驶汽车更加智能化&#xff0c;能够实现更高级的驾驶体验&#xff0c;今天这篇文章就和大家一起探讨一下 VR虚拟驾驶未来发展的趋势&#xff0c;以及虚拟现实自动驾驶汽车所带来的几个改变。 一、VR 虚拟驾驶未…

UnityShaderGraph 卡通水面效果

效果预览&#xff1a; 原理&#xff1a; 使用三张噪声贴图&#xff0c;结合UV偏移制作水面波纹混合的假象效果 噪声图1&#xff1a; 噪声图2&#xff1a; 噪声图3&#xff1a; 三次采样都是同样的方法&#xff0c;使用step函数来二分噪声 三张噪声采样结果相乘得到最终的波纹…

深度学习与大模型第1课环境搭建

文章目录 深度学习与大模型第1课环境搭建1. 安装 Anaconda2. 修改环境变量2.1 修改 .condarc 文件2.2 使用 Anaconda Prompt 修改环境变量 3. 新建 .ipynb 文件 机器学习基础编程&#xff1a;常见问题&#xff1a; 深度学习与大模型第1课 环境搭建 1. 安装 Anaconda 首先&am…

Ai Illustrator 取消吸附到像素点,鼠标拖动的时候只能到像素点

Ai Illustrator 取消吸附到像素点&#xff0c;鼠标拖动的时候只能到像素点 在做图的时候无意间变成吸附到像素点了&#xff0c;导致无法更细致的移动点。 像这样&#xff1a; 关闭的方法是打开上面菜单中的 【视图】取消勾选【对齐像素】 即可。 结果就是&#xff1a;

新160个crackme - 048-monkeycrackme1

运行分析 ![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/8e7c9973721b4df1997cc9a83e0ef2b6.png 500x) 点击注册无反应 PE分析 Delphi程序&#xff0c;32位&#xff0c;无壳 静态分析&动态调试 使用DeDeDark进行分析&#xff0c;发现Register按钮事件地址入口…

容性负载箱如何测量电容器的容量、电压、泄漏电流和ESR等参数?

容性负载箱是用于测量电容器参数的重要设备。它的主要功能是通过向电容器施加不同的负载&#xff0c;从而测量电容器的容量、电压响应、损耗等关键参数。 具体来说&#xff0c;容性负载箱可以通过以下方式测量电容器的各项参数&#xff1a; 1. 测量电容器的容量&#xff1a;容…

Java项目:139 springboot基于SpringBoot的论坛系统设计与实现

项目介绍 论坛系统设置的角色有管理员&#xff0c;版主&#xff0c;用户等。 管理员管理论坛&#xff0c;主要是对论坛帖子增删改查以及对论坛帖子回复进行查看&#xff0c;对版主和用户进行管理&#xff0c;管理新闻等。 版主可以发布帖子&#xff0c;可以查询论坛帖子&…

【Ubuntu20.04】配置深度学习环境

参考 Ubuntu20.04配置深度学习环境&#xff08;全网最细最全&#xff09; NVIDIA显卡驱动安装安装CUDA 通过终端nvidia-smi查看自己能安装的最高CUDA版本&#xff0c;在官方网址下载需要的版本。安装cuDNN 在官方网址选择适配于自己安装的CUDA版本的cuDNN安装Anaconda &#x…

Elastic Stack-ES集群常用的API

前言&#xff1a;本博客仅作记录学习使用&#xff0c;部分图片出自网络&#xff0c;如有侵犯您的权益&#xff0c;请联系删除 学习B站博主教程笔记&#xff1a; 最新版适合自学的ElasticStack全套视频&#xff08;Elk零基础入门到精通教程&#xff09;Linux运维必备—Elastic…

JavaScript事件

DOM事件 事件概念&#xff1a;事件是文档或浏览器中发生的交互行为的响应。事件流&#xff1a;分为三个阶段&#xff1a; 捕获阶段&#xff1a;事件从根节点开始&#xff0c;逐级向下传播至目标节点。目标阶段&#xff1a;事件在目标节点上被处理。冒泡阶段&#xff1a;事件从…

Python作为客户端连接websocket

缘起 因为需要将MQTT中的数据推送给前端,但是前端不会直接连接MQTT,所以服务端做了一个中间层,通过websocket推送,但是在开发的过程中前端总是认为推送的数据不及时,所以这里又实用Python单独做了一个客户端做时间记录验证。开始吧 安装三方包 Python的生态很方便,这里…

java编程实现ElGamal的加密和解密题目实例

1.题目 编程实现ElGamal的加密和解密&#xff0c;假设用户A选择素数p11和本原根g2&#xff0c;并且选择私钥α5&#xff0c;输出A的公钥&#xff1b;若用户B向用户A发送消息m6&#xff0c;随机数k7&#xff0c;输出对该消息加密后的密文&#xff0c;以及对密文进行解密的明文。…

上海晋名室外危化品暂存柜助力新能源行业发展

近日又有一个SAVEST室外危化品暂存柜项目成功验收交付使用。 用户在日常经营活动中涉及到气瓶和硅粉的室外安全暂存问题&#xff0c;4月下旬在网上看到上海晋名室外暂存柜系列很感兴趣&#xff0c;联系到了销售部钟经理&#xff0c;双方对晋名的室外暂存柜进行了高效的沟通&am…

cesium 使用异步函数 getHeightAtPoint,获取指定经纬度点的地形高度。

这个函数使用 CesiumJS 库的 sampleTerrain 方法来获取地形数据。下面是代码的详细解释&#xff1a; async getHeightAtPoint(LngLat) {// 将经纬度转为 Cartographic 对象let cartographics [Cesium.Cartographic.fromDegrees(LngLat[0], LngLat[1])];// console.log("…

Day 3 - 5 :线性表 — 单链表

存储结构 将线性表中的各元素分布在存储器的不同存储块&#xff0c;称为结点。 结点的data域存放数据元素ai&#xff0c;而next域是一个指针&#xff0c;指向ai的直接后继ai1所在的结点。 如果要删除a1&#xff0c;只要修改a1前手元素指针的指向即可。 例如&#xff1a;需要找到…

内存管理篇-22 高端内存和低端内存的分界线

这节课讲的主是为了区分低端内存和高端内存的是如何区分的&#xff1f;内核空间的划分是可以配置的。为了查看现象&#xff0c;通过qemu设置物理内存为不同情况。 结论&#xff1a;线性映射区的大小&#xff0c;和page_offset(内核起始地址0x80000000还是0xc0000000)和物理内存…

JavaEE(2):前后端项目之间的交互

现在&#xff0c;在网页中通过超链接&#xff0c;表单就可以向后端发送请求&#xff0c;后端也可以正常响应内容。 以前通过表单访问后端的请求方式称为同步请求 同步请求 当网页与后端交互时&#xff0c;前端不能再进行其他操作 服务器端响应回来的内容&#xff0c;会把整个浏…

2024年高教社杯数学建模国赛赛题浅析——助攻快速选题

一图流——一张图读懂国赛 总体概述&#xff1a; A题偏几何与运动学模型&#xff0c;适合有几何与物理背景的队伍&#xff0c;数据处理复杂性中等。 B题侧重统计和优化&#xff0c;适合有运筹学和经济学背景的队伍&#xff0c;数据处理较为直接但涉及多步骤的决策优化。 C题…

云计算实训39——Harbor仓库的使用、Docker-compose的编排、YAML文件

一、Harbor部署 1.验证python版本 [rootdocker2 ~]#python --version 2.安装pip [rootdocker2 ~]# yum -y install python2-pip #由于版本过低&#xff0c;需要对其进行一个升级 #更新pip [rootdocker2 ~]#pip install --upgrade pip 3.指定版本号 [rootdocker2 ~]# p…